2016-09-26 118 views
1

在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是什麼?

回答

1

什麼是你的嵌套模型的結構?如果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