javascript - 将某些 observableArray 对象属性转换为 observable

标签 javascript knockout.js knockout-mapping-plugin

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

var people = [
    { status: 0, name: "name1"},
    { status: 1, name: "name2"}
];

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

假设可以添加或删除对象本身。这些对象中的任何一个的名称属性都不会改变,所以我真的不需要观察名称,但每个对象的状态可能会改变,因此让它可观察会很酷。

是否可以使用带有一些很酷的 hack 语法的 knockout 实用程序来映射它,或者我是否必须遍历每个对象并将其状态属性映射到可观察的,或者让整个数组及其对象属性都可观察?

最佳答案

您可以使用 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
        }
    }
});

现在 vm 是一个包含对象的 observableArray,其中状态是可观察的,名称是常规属性。

See fiddle

@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;
}});

See updated fiddle

你也可以使用 observe带映射参数

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

See fiddle

希望对你有帮助。

关于javascript - 将某些 observableArray 对象属性转换为 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17925146/

相关文章:

javascript - knockout 映射和绑定(bind)

knockout.js - Knockout isDirty 示例,使用映射插件中的动态 View 模块

javascript - 类型错误 : Cannot read properties of undefined (reading 'getContractFactory' ) when testing contract

javascript 将文本添加到发送到数据库的字符串

knockout.js - 将元素放入挖空 View 模型中

javascript - 为什么当页面加载时,knockoutjs 不运行这个计算函数?

javascript - 使用 jquery 插件 slick carousel 自定义箭头和点

javascript - Highcharts - 仅当值为 null 时才连接 null

javascript - knockout : How to select an item by property name from an observableArray of objects

Knockout.js 将 JSON 对象映射到 Javascript 对象