添加/删除Knockout observableArray嵌套元素

时间:2012-10-04 01:41:56

标签: javascript knockout.js

我正在尝试在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/

1 个答案:

答案 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/

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