Knockout.js 如何使敲除可观察数组中的对象属性是可观察的?

Knockout.js 如何使敲除可观察数组中的对象属性是可观察的?,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,当在敲除映射中使用“create”选项时,我们将使该数组成为可观察数组。 但是我们如何使可观测数组中每个对象的属性成为可观测的呢 在这个来自敲除文档的示例中,子数组是一个可观察的数组,但我想让每个对象文本中的所有元素(如id、name)也是一个可观察的。我们如何做到这一点。在创建块中的每个新对象上放置一个ko.observable var data = { name: 'Graham', children: [ { id : 1, name : 'Lisa' }

当在敲除映射中使用“create”选项时,我们将使该数组成为可观察数组。 但是我们如何使可观测数组中每个对象的属性成为可观测的呢

在这个来自敲除文档的示例中,子数组是一个可观察的数组,但我想让每个对象文本中的所有元素(如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);
根据:

  • 对象的所有属性都转换为可观察的属性
因此,在下面关于使用“创建”自定义对象构造的部分中,它指出

当然,在create回调中,您可以对 ko.mapping.fromJS,如果您愿意的话

提供的示例如下:

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

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

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

快速答案是使对象的属性可见

var myChildModel = function (data) {
    this.id = ko.observable(data.id);
    this.name = ko.observable(data.name);
;
这也可能是最简单的方法,不过还有其他一些方法:

var viewModel = ko.mapping.fromJS(data);
它做任何事情,使属性和数组都可见。此方法的第二个参数仅用于自定义。如果不需要,您不必使用它