0

我试图了解如何使用列出一些项目的小小提琴来嵌套 knockoutjs 视图模型,然后单击按钮,它会显示该项目的详细信息。然后,我有一个按钮,通过向每个项目添加 15 来更新每个项目的 Id 属性,但出于某种原因,它们最终具有相同的值。有人可以启发我吗?

谢谢!

有问题的小提琴

4

2 回答 2

2

这是您的.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);
    }
};
于 2013-02-06T13:43:50.440 回答
0

你能把Name房产搬到itemModel?

self.Name = ko.computed(function() { 
    return 'Item_' + self.Id();
});

在创建对象而不是在使用它时设置它似乎很奇怪。

于 2013-02-06T13:59:43.883 回答