将某些observableArray对象属性转换为可观察对象

pat*_*ryk 5 javascript knockout-mapping-plugin knockout.js

假设我有这个相同类型的对象数组:

var people = [
    { status: 0, name: "name1"},
    { status: 1, name: "name2"}
];
Run Code Online (Sandbox Code Playgroud)

我希望它不仅是observableArray,而且我想要观察每个对象的状态属性.

想象一下,可能会添加或删除对象本身.任何这些对象的name属性都不会改变,因此我不需要观察名称,但每个对象的状态可能会发生变化,因此让它可观察是很酷的.

是否可以使用一些很酷的黑客语法将其与knockout实用程序一起映射,或者我是否必须迭代每个对象并将其status属性映射到observable,或者让整个数组及其对象属性可观察?

Dam*_*ien 5

您可以使用ko.mapping.fromJS

var vm = ko.mapping.fromJS(people,{
    create: function(options){    
        return {
            status : ko.observable(options.data.status), // observable
            name: options.data.name, // non observable
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

现在,vm是一个observableArray,它包含状态是可观察的对象,name是常规属性.

看小提琴

@Patryk:

你可以这样做,如果你有很多属性,并且你只想将一个属性转换为可观察属性.

var o = ko.mapping.fromJS(people,{create: function(options){
    // clone item
    var item = ko.utils.extend(options.data, {});
    // replace status property by an observable 
    item.status = ko.observable(options.data.status);
    return item;
}});
Run Code Online (Sandbox Code Playgroud)

看到更新的小提琴

您还可以将observe与mapping参数一起使用

var mapping = {
    create: function (options) {
        return ko.mapping.fromJS(options.data, {'observe': ["status"]});
    }
};
var o = ko.mapping.fromJS(people, mapping);
Run Code Online (Sandbox Code Playgroud)

看小提琴

我希望它有所帮助.