Knockoutjs嵌套视图模型更新

时间:2013-02-06 13:09:49

标签: mvvm knockout.js nested viewmodel

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

谢谢!

The fiddle in question

2 个答案:

答案 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();
});

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