如何使剔除可观察数组中的对象属性可观察?

Posted

技术标签:

【中文标题】如何使剔除可观察数组中的对象属性可观察?【英文标题】:How to make object properties in a knockout observable array be observable? 【发布时间】:2014-10-23 16:23:39 【问题描述】:

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

在淘汰文档的这个例子中,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);

【问题讨论】:

【参考方案1】:

简单地说:

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

它做所有事情,使属性和数组都可观察。此方法的第二个参数仅用于自定义目的。不需要就不用了!

【讨论】:

【参考方案2】:

根据documentation:

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

因此,在关于使用“create”自定义对象构造的部分中,它指出

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

提供的例子如下:

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

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

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

【讨论】:

【参考方案3】:

快速的答案是让对象的属性可观察

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

这也可能是最简单的方法,虽然还有其他方法

【讨论】:

以上是关于如何使剔除可观察数组中的对象属性可观察?的主要内容,如果未能解决你的问题,请参考以下文章

Knockoutjs:如何使添加到列表中的输入值也可观察

Knockout JS,如何在更改可观察数组中的值时更改样式属性

淘汰赛将选择绑定到动态可观察数组

循环遍历具有可观察属性的 Knockout 可观察对象数组

Knockout.js:当可观察数组中的值发生变化时触发计算的最佳方法是啥

在子集合中的项目内容上创建计算属性