如何在knockout可观察数组中创建对象属性是可观察的?

时间:2014-08-29 16:00:46

标签: knockout.js knockout-mapping-plugin

当在knockout映射中使用'create'选项时,我们会使数组成为一个可观察的数组。 但是,我们如何使可观察数组中每个对象的属性成为可观察的?

在这个来自淘汰文档的例子中,children数组是一个可观察的数组,但我想让每个对象文字中的所有元素如id,name也是一个可观察的元素。我们如何实现这一目标。只需在创建块中的每个新建对象上放一个ko.observable吗?

var data = {
    name: 'Graham',
    children: [
        { id : 1, name : 'Lisa' }
    ]
};

// Your custom data model
var myChildModel = function (data) {
    this.id = data.id;
    this.name = data.name;
};

var mapping = {
    'children': {
        create: function(options) {
            return new myChildModel(options.data);
        }
    }
};

var viewModel = ko.mapping.fromJS(data, mapping);

3 个答案:

答案 0 :(得分:1)

根据documentation

  • 对象的所有属性都将转换为可观察对象。

因此,在关于使用“创建”自定义对象构造的部分中,它表示

  

当然,在创建回调中你可以再做一次调用   ko.mapping.fromJS如果你愿意的话。

提供的示例如下:

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

  this.nameLength = ko.computed(function() {
    return this.name().length;
  }, this);
}

当然,这会转换所有属性。然后可以将更详细的配置专门应用于该映射调用以处理自定义要求。

答案 1 :(得分:1)

快速回答是使对象的属性可观察

var myChildModel = function (data) {
    this.id = ko.observable(data.id);
    this.name = ko.observable(data.name);
;

它也可能是最简单的方法,但还有其他方式

答案 2 :(得分:1)

简单地:

var viewModel = ko.mapping.fromJS(data);

它完成所有操作,使属性和数组都可观察。此方法的第二个参数仅用于自定义。如果您不需要,则不必使用它!

相关问题