我试图了解如何使用列出一些项目的小小提琴来嵌套 knockoutjs 视图模型,然后单击按钮,它会显示该项目的详细信息。然后,我有一个按钮,通过向每个项目添加 15 来更新每个项目的 Id 属性,但出于某种原因,它们最终具有相同的值。有人可以启发我吗?
谢谢!
我试图了解如何使用列出一些项目的小小提琴来嵌套 knockoutjs 视图模型,然后单击按钮,它会显示该项目的详细信息。然后,我有一个按钮,通过向每个项目添加 15 来更新每个项目的 Id 属性,但出于某种原因,它们最终具有相同的值。有人可以启发我吗?
谢谢!
这是您的.Name
计算属性。Id 更改工作正常。
http://fiddle.jshell.net/Y3JXD/1/
在第一次执行之后,闭包中的 in 始终是列表中的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);
}
};
你能把Name
房产搬到itemModel
?
self.Name = ko.computed(function() {
return 'Item_' + self.Id();
});
在创建对象而不是在使用它时设置它似乎很奇怪。