我正在尝试理解如何使用一个小小提琴嵌套knockoutjs视图模型列出一些项目,点击一个按钮,它会显示该项目的详细信息。然后,我有一个按钮,通过向每个项添加15来更新每个项的Id属性,但由于某种原因,它们最终在最后具有所有相同的值。 有人可以开导我吗?
谢谢!
答案 0 :(得分:2)
这是你的.Name
计算属性。 Id更改正常工作。
http://fiddle.jshell.net/Y3JXD/1/
第一次执行后,闭包中的item
始终是列表中的最后一个item
。请记住,只要可观察的更改,计算结果就会更新。因此,第一次在设置期间,它工作正常,因为item
是来自循环的item
。但是,在闭包中捕获的只是item
(第15项),而不是那个特定循环实例的那个。
更新:忘记了根据评论建议计算的第二个参数。
http://fiddle.jshell.net/Y3JXD/1/
item.Name = ko.computed(function () { return 'Item_' + item.Id(); }, item);
这是另一种技术,用于在闭包中包装引用,并捕获正确的item
实例(就像演示捕获适当范围所需的内容一样)。
self.loadItems = function () {
for (var i = 0; i < 15; i++) {
var item = ko.mapping.fromJS({
Id: i
});
self.items.push(item);
(function (item) {
item.Name = ko.computed(function () {
return 'Item_' + item.Id();
});
})(item);
}
};
答案 1 :(得分:0)
您可以将Name
属性移至itemModel
吗?
self.Name = ko.computed(function() {
return 'Item_' + self.Id();
});
在创建对象时设置它似乎很奇怪,而不是在使用它时。