knockout.js KnockoutJS网格以添加项目

ahy6op9u  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(176)

我目前有一个表格,将让用户添加项目的提交,因为我是非常新的KnockoutJS我只是做了这个表格接受一个产品的提交

<script type="text/html" id="page4-template">
<h4>Strain Information : </h4>
<table>
    <tr>
        <td class="firstCol">Stock number : </td>
        <td><span id="SummaryP1_StockNum" data-bind="text: stockNumber"></span></td>
    </tr>
    <tr>
        <td class="firstCol">Product Needed : </td>
        <td>
            <span id="SummaryP1_pdtNeeded" data-bind="text: pdtNeeded"></span>
            <span data-bind="visible: pdtNeeded() == 'Other'">
                <span id="SummaryP1_pdtNeededPleaseExplain" data-bind="text: pdtNeededPleaseExplain"></span>
            </span>
        </td>
    </tr>
    <tr>
        <td class="firstCol">Requested Ship Date : </td>
        <td><span id="SummaryP1_RequestedShipDate" data-bind="text: requestedShipDate"></span></td>
    </tr>
    <tr>
        <td class="firstCol">Aditional Information : </td>
        <td><span id="SummaryP1_AdditionalInformation" data-bind="text: additionalInformation"></span></td>
    </tr>

</table>
<hr>
</script>

如果我需要让这个表单允许用户动态添加更多的项目到提交,我应该在这里使用什么,我有点困惑,因为你是动态自举,Overservable数组和所有。谁能请建议我可以做什么简单,以允许用户动态添加项目。

xdyibdwo

xdyibdwo1#

我建议采取三个步骤:
第一步是将绑定到表元素的所有可观察属性收集到一个对象中:

createRowItem = function(data) {
    return {
        additionalInformation = ko.observable(data.additionalInformation),
        pdtNeeded = ko.observable(data.pdtNeeded),
        pdtNeededPleaseExplain = ko.obsevable(data.pdtNeededPleaseExplain),
        requestedShipDate = ko.observable(data.requestedShipDate),
        stockNumber = ko.observable(data.stockNumber),
    }
};

您将获得一个新rowItem的示例...

var newRowItem = createRowItem(data);

第二步是在现有的视图模型中创建一个observableArraydocumentation):

self.rowItems = ko.observableArray([]);

要用rowItem示例的集合填充该数组,您 * 可以 * 调用self.rowItems.push(newRowItem)(文件)但取得内部数组的指涉会更有效率(* 即 * observableArray正在监视的基元数组),将新示例添加到该数组中,然后告诉observableArray它的数据已经被更新了。[这种效率的原因与Knockout的内部工作方式和跟踪突变有关。]
我的建议是在视图模型的公共函数中执行此操作:

self.addRowItem = function(newRowItem) {
    var arr = ko.unwrap(self.rowItems);  // obtain the underlying array
    arr.push(newRowItem);  // add the new object to the underlying array
    self.rowItems.valueHasMutated();  // tell Knockout that the underlying array has been modified
};

最后一步是将您的<tr>元素 Package 在foreach绑定(documentation)中:

<script type="text/html" id="page4-template">
<h4>Strain Information : </h4>
<table data-bind="foreach: rowItems">
    <tr>
        <td class="firstCol">Stock number : </td>
        <td><span id="SummaryP1_StockNum" data-bind="text: stockNumber"></span></td>
    </tr>
    ...
</table>
91zkwejq

91zkwejq2#

你确实需要使用observableArray来存储多个条目,然后用foreach绑定循环遍历这个数组,并在视图模型上添加一个方法来将新条目推送到这个数组中。
大概是这样的:

vm.row = ko.observableArray();

vm.addRow = function () {
    vm.row.push({
        stockNumber: ko.observable(1),
        pdtNeeded: ko.observable('Other'),
        pdtNeededPleaseExplain: ko.observable('Hello'),
        requestedShipDate: ko.observable(),
        additionalInformation: ko.observable()
    })
}

小提琴:https://jsfiddle.net/thebluenile/2q8tbp5n/
为了更好地衡量,我还添加了一个如何删除行的示例。

相关问题