Ember观察嵌套模型属性

时间:2016-09-26 10:41:54

标签: javascript ember.js

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

以下似乎不起作用;

modelChanged: function() {  

}.observes('myModel.@each.@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. 在上面的代码中," observeObjects"只是为这个arr [0]中的第一个外部数组和track属性添加。我有多个外部   数组元素

         
        
    1. 如何修改上述内容以跟踪多个属性?即   在某些情况下,它将被选择为值"或者它可以   " preSelectedValue"在其他情况下。它的属性取决于什么   在那个对象本身。但我需要跟踪其中任何一个的变化   selectedValue / preSelectedValue

    2.   
    3. 同样在observerMethod,我能得到吗?   上下文并检查新的selectedValue / preSelectedValue是什么?

    4.   
  2.   

1 个答案:

答案 0 :(得分:1)

嵌套模型的结构是什么?如果myModel是具有selectedValue的元素数组,则可以使用myModel.@each.selectedValue。如果您需要多级嵌套,则不支持开箱即用。

来自documentation

  

请注意@each只能深入一级。您不能使用嵌套表单,如todos。@ each.owner.name或todos。@ each.owner。@ each.name。

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

更新:根据myModel的设置/更新方式,您可能需要调整调用observeMyModelChildren的时间以及创建观察者的方式。

// observerMethod is called when myModel.@each.@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'),