我正在尝试在KnockoutJS中添加/删除嵌套的observableArray。我有一个数组元素,每个元素都有一个属性对象,类型对象和一个包含对象的attributeValue数组。所以它是一个嵌套数组。
allAttributes数组是observableArray。然后我尝试通过将一个带有attributeValues的新ViewModel(attributeValueViewModel)作为ko.observableArray([])来使attributeValue数组可观察。
我制作了两个Knockout函数(不起作用),我正在尝试向/从该数组中添加/删除值。问题是数组是嵌套的,所以我必须通过this.attribute.id访问attributeID。 self.allAttributes [i] .attributeValues [j]应该是我正在添加/删除的对象...其中 i = attributeID而j =属性值对象的索引
为什么这些功能不起作用?
这是我的小提琴:http://jsfiddle.net/M6Hqj/2/
答案 0 :(得分: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
调用实际上是指您的attributeValues
数组中内的特定记录,因此,this.attributeValues.splice()
1}},它无法找到您的attributeValues
对象属性。因此,将函数转移到attributeValueViewModel
对象并使用self
代替this
,如下所示:
//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/
(请注意,通过这些更改,您仍然需要修改逻辑以正确添加/删除元素,因为它仍然存在错误)