我试图了解如何使用列出一些项目的小小提琴来嵌套 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();
});
在创建对象而不是在使用它时设置它似乎很奇怪。