【问题标题】:Knockoutjs observe nested object and subscribe for changesKnockoutjs 观察嵌套对象并订阅更改
【发布时间】:2014-05-17 20:45:00
【问题描述】:

看一下淘汰赛 js 和映射插件。 我注意到,如果我传递一个对象,我无法订阅它以进行更改。 基本上,如果对象的任何成员发生更改,我希望得到通知。我真的不在乎 取回改变的属性(但如果可能的话想知道如何)

function EventsKoModel(data){
    var self = this;
    self.event = ko.mapping.fromJS(data);
   //the below throws Error 
    //TypeError: self.event.subscribe is not a function
    self.event.subscribe(function(){
       console.log("something changed");
     });
}

var data = {
    'id': 14124124124124,
    'name': 'Some Event',
    'events': [{
       'id': 1
     },{
        'id': 2
      }]
}
var d = new EventsKoModel(data);
ko.applyBindings(d);

但是,如果我传递一个带有对象的数组,它就可以工作 看到给fromJS传对象的时候,返回的对象没有subscribe方法 有没有办法解决这个问题?

谢谢

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    假设您希望订阅者在每次更新 event 时触发,包括第一次设置时。你可以试试这个;

    function EventsKoModel(data){
        var self = this;
        self.event = ko.observable();
        self.event.subscribe(function(){
            console.log("something changed");
        });
        ko.mapping.fromJS(data, {}, self);
    }
    

    【讨论】:

    • 从服务器获取数据后,第一次触发该事件,但当我更新映射时不会触发该事件。我在获取数据时使用 ko.mapping.fromJS(data, self)
    • 好的,成功了。我的错。但是请给我解释一下。即使事件属性没有更新,事件也会被触发?因为,在上面的例子中,self.event 永远不会改变
    • 在这种情况下,self.event 是一个 observable,其值是一个普通对象(碰巧包含一些 observables,但这并不重要。因此,对对象本身会触发订阅,任何对对象属性的改变都是对对象的改变。
    • 感谢您的解释。有没有办法找到嵌套对象中的哪个属性发生了变化?
    【解决方案2】:

    前段时间我也有同样的要求,为此编写了 Knockout Reactor。它在订阅分层模型方面做得很好,并提供了让您立即开始工作可能需要的大部分功能。

    这是它的链接:

    https://github.com/ZiadJ/knockoutjs-reactor

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多