2

我正在尝试在 KnockoutJS 中的嵌套 observableArray 中添加/删除。我有一个数组,有几个元素,每个元素都有一个属性对象、类型对象和一个包含对象的属性值数组。所以它是一个嵌套数组。

allAttributes 数组是 observableArray。然后我尝试通过创建一个新的 ViewModel (attributeValueViewModel) 来使 attributeValue 数组可观察,attributeValues 为 ko.observableArray([])。

我做了两个 Knockout 函数(不起作用),我正在尝试向该数组添加/删除值。问题是数组是嵌套的,所以我必须通过this.attribute.id访问attributeID。self.allAttributes[i].attributeValues[j] 应该是我要添加/删除的对象...其中i=attributeID 和 j=属性值对象的索引

为什么这些功能不起作用?

这是我的小提琴:http: //jsfiddle.net/M6Hqj/2/

4

1 回答 1

1

首先,您正在覆盖内部视图模型中的可观察函数,例如,当您分配时obj.attribute = item.attribute;,您正在覆盖您的初始分配self.attribute = ko.observable(data.attribute);。而是通过 observable 分配值,如下所示:

obj.attribute(item.attribute); //instead of obj.attribute = item.attribute;

这也将使您的self.addAttributeValue()函数调用工作,因为数组现在是可观察的。

接下来,在您的函数self.removeAttributeValue()this调用实际上是指数组中的特定记录,因此,当您这样做时,它找不到您的对象属性。因此,将函数转移到对象中并使用而不是,如下所示:attributeValuesthis.attributeValues.splice()attributeValuesattributeValueViewModelselfthis

//This is inside function attributeValueViewModel(data)
self.removeAttributeValue = function() {
    alert(JSON.stringify(this));
    self.attributeValues.splice(this.id, 1);
}

要调用它,只需将数据绑定代码更改为使用$parent而不是$root,如下所示:

<button data-bind="click: $parent.removeAttributeValue">REMOVE</button>

像这样的小提琴在这里:http: //jsfiddle.net/UMB79/

(请注意,通过这些更改,您仍然必须修改逻辑以正确添加/删除元素,因为它仍然存在问题)

于 2012-10-04T02:09:07.933 回答