Ember观察嵌套模型属性

问题描述:

在EmberJS中,如果我想观察一个嵌套模型中的属性“selectedValue”,我该怎么做?Ember观察嵌套模型属性

下面似乎没有工作;

modelChanged: function() { 

}.observes('[email protected]@each.selectedValue'), 

也低于不起作用

modelChanged: function() { 

}.observes('myModel'), 

这是基于myModel怎么看起来像

[ 
    [{ 
     "prop1": "abc_1", 
     "selectedValue": "abc_1" 
    }, { 
     "prop1": "xyz_1", 
     "selectedValue": "xyz_1" 
    }], 
    [{ 
     "prop1": "abc_2", 
     "selectedValue": "abc_2" 
    }, { 
     "prop1": "xyz_2", 
     "selectedValue": "xyz_2" 
    }], 
    [{ 
     "prop1": "abc_3", 
     "selectedValue": "abc_3" 
    }, { 
     "prop1": "xyz_1", 
     "selectedValue": "xyz_1" 
    }] 
] 

更新基于

似乎是工作...只是一对夫妇问题;

  1. 在上面的代码中, “observedObjects” 只是增加了对所述第一外部阵列和这种ARR内跟踪属性[0]。我有多个外层 阵列元素

    1. 如何修改上述内容以跟踪多个属性?即 在某些情况下,它将是“selectedValue”,或者在其他情况下可以是 “preSelectedValue”。该物体本身的属性取决于 。但我需要在observerMethod跟踪要么 了selectedValue的变化/ preSelectedValue

    2. 而且,我可以得到 上下文并检查新了selectedValue/preSelectedValue是什么?

什么是你的嵌套模型的结构?如果myModel是具有selectedValue的元素数组,则可以使用[email protected]。如果您需要多层嵌套,那么不支持开箱即用。

documentation

注意@each只能深一个层次。你不能使用像todos这样的嵌套表单。@ each.owner.name或todos。@ each.owner。@ each.name。

有一些解决方法取决于您的模型结构,如果您回答或更新结构中的问题,我会更新我的答案以涵盖适当的解决方案。

更新:根据myModel是如何设置/更新,你可能需要调整时observeMyModelChildren被称为以及如何创建观察员。

// observerMethod is called when [email protected]@each.selectedValue changes 
observerMethod: function() { 
    // handle change 
}, 

// observedObjects tracks child observers so they can be removed 
observedObjects: [], 

// observeMyModelChildren listens for changes to myModel, removes 
// old observers, and adds new ones 
observeMyModelChildren: function() { 
    const key = '@each.selectedValue'; 

    this.get('observedObjects').forEach((el) => { 
    el.removeObserver(key, this, this.observerMethod); 
    }); 
    this.set('observedObjects', []); 

    let observedObjects = []; 
    this.get('myModel').forEach((el) => { 
    el.addObserver(key, this, this.observerMethod); 
    observedObjects.pushObject(el); 
    }); 
    this.set('observedObjects', observedObjects); 
}.observes('myModel'), 

更新2:如果你想支持多个观测特性(例如其他型号),你可以做做到这一点通过修改observeMyModelChildren

observePropertyChildren: function (obj, attr) { 
    console.log('setting up observers on', attr); 

    var key = 'observedObjects.' + attr; 
    var observedObjects = this.get(key) || []; 
    observedObjects.forEach((el) => { 
    el.removeObserver('@each.selectedValue', this, this.observerMethod); 
    }); 

    this.get(attr).forEach((el) => { 
    el.addObserver('@each.selectedValue', this, this.observerMethod); 
    observedObjects.pushObject(el); 
    }); 
    this.set(key, observedObjects); 
}.observes('myModel', 'myOtherModel'), 
+0

非常感谢。我用我的模型结构更新了这个问题。正如你所看到的,它有一个嵌套/复杂的数组结构类型,我想追踪它里面的“selectedValue” – testndtv

+0

请让我知道你是否需要额外的信息 – testndtv

+0

已更新。让我知道如果你有任何问题 – maffews