首页 文章

Knockout-3.2.0 - 内部列表<object>推送问题

提问于
浏览
1

我正在使用knockout.js作为asp应用程序 . 我有一个控制器操作返回给视图的对象列表,而且列表中的那些对象指向一个对象列表 . 我无法通过淘汰赛将新对象添加到内部列表中 . 到目前为止我所做的是:

@{
     var initialData = @Html.Raw(new System.Web.Script.Serialization
                                  .JavaScriptSerializer().Serialize(Model));
 }

并在viewmodel中:

LineItemFields = ko.observableArray(@initialData );

在viewmodel中添加函数执行以下操作:

addLineItem = function () {
   ko.utils.arrayForEach(ko.toJS(LineItemFields), function (item) {
     item.LineItemValues.push({"FieldValue": "0", "configseqid": 0, "FieldID": 0,
                               "isVisible": true, "isUpdatable": true });
   });

//LineItemValues is the inner list of each object being iterated.

我尝试调试脚本,它成功地将一个新项目推送到正在迭代的对象的内部列表,但不是在原始对象中 . 含义item.LineItemValues是一个副本,而不是LineItemFields [index] .LineItemValues,我可以做更多的事情,以便新项目应该在可观察数组中推送?

更新:我的模板绑定和脚本是:

<tr data-bind="template: {name: 'LineItemDataTemplate', foreach: LineItemFields}"> </tr>

 <script id="LineItemDataTemplate" type="text/html">
        <td data-bind="foreach: $data['LineItemValues']"><input type="text" data-bind="value: FieldValue, enable: $parent.isUpdatable" /></td>
</script>

1 回答

  • 1

    ko.toJS() 将创建 observableArray 的普通js副本 . 您需要使用包含在该可观察数组中的原始数组:

    ko.utils.arrayForEach(LineItemFields(), function (item) {
        item.LineItemValues.push({ "FieldValue": "0", "configseqid": 0, "FieldID": 0,
                                   "isVisible": true, "isUpdatable": true });
    });
    

相关问题