问题 如何在可观察数组中执行Knockout可观察对象


我想实现一个可观察的数组,在该数组中应该有可观察的对象(JS对象)。在视图中,我正在迭代此数组并获取对象并显示对象属性。假设有一个像下面这样的对象,

{"name":"john","age":21,"address":"No 25"}

想象一下,可观察数组由上面的对象组成。

然后我想换单 属性  (例如)a 特别的对象 并且需要查看视图上的更改。

我怎么能用淘汰赛做到这一点?

谢谢。


8271
2018-06-04 09:46


起源



答案:


如果您在viewModel中设置用户并将其映射到 淘汰赛映射 你应该得到想要的结果。就像是:

myObservableArray.push(new UserViewModel( {"name":"john","age":21,"address":"No 25"} ));  

var UserViewModel = function(data){
    var self = this;
    ko.mapping.fromJS(data, {}, self);    
}

这样,每个映射的属性都是可观察的,当它们发生变化时,这将反映在您的标记中。


9
2018-06-04 10:13



截至目前,答案中引用的插件似乎已被放弃。 - Tamás Szelei
它仍然适用于Knockout的最新版本(3.4.0) - Rune Vejen Petersen


答案:


如果您在viewModel中设置用户并将其映射到 淘汰赛映射 你应该得到想要的结果。就像是:

myObservableArray.push(new UserViewModel( {"name":"john","age":21,"address":"No 25"} ));  

var UserViewModel = function(data){
    var self = this;
    ko.mapping.fromJS(data, {}, self);    
}

这样,每个映射的属性都是可观察的,当它们发生变化时,这将反映在您的标记中。


9
2018-06-04 10:13



截至目前,答案中引用的插件似乎已被放弃。 - Tamás Szelei
它仍然适用于Knockout的最新版本(3.4.0) - Rune Vejen Petersen


要将模型转换为可观察的视图模型,您可以使用 ko.utils.arrayMap 和 ko.mapping.fromJS

var source = [{"name":"john","age":21,"address":"No 25"}];
var vm = ko.utils.arrayMap(source, function (item) {
    return  ko.mapping.fromJS(item)
});

看小提琴


2
2018-06-04 11:17





只需为您的数据项定义一个新模型,并使每个属性都可观察,如下所示:

var dataItemModel = function (name, age, address) {
    this.name = ko.observable(name);
    this.age = ko.observable(age);
    this.address = ko.observable(address);
}

当你获得数据时,循环遍历它们,创建你的数据 dataItemModel(具有可观察的属性)然后将此项添加到您的 ObservableArray


2
2018-06-04 11:25