2016-09-26 2 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» просто добавляет для первого внешнего массива и отслеживает свойство в этом обр [0]. У меня есть несколько внешних элементов

    1. Как изменить приведенное выше значение для отслеживания нескольких свойств? то есть В некоторых случаях это будет «selectedValue» ИЛИ оно может быть «preSelectedValue» в других случаях. Какое свойство будет зависеть от этого объекта: . Но мне нужно отслеживать изменение либо SelectedValue/preSelectedValue

    2. Также в observerMethod, могу ли я получить контекст и проверить, что новый SelectedValue/preSelectedValue это?

ответ

1

Какова структура вашей вложенной модели? Если myModel - это массив элементов с selectedValue, вы можете использовать [email protected]. Если вам нужно несколько уровней вложенности, это не поддерживается из коробки.

Из documentation:

Обратите внимание, что @each работает только один уровень. Вы не можете использовать вложенные формы, например todos. @ Each.owner.name или todos. @ Each.owner. @ Each.name.

Есть временные решения, которые зависят от структуры вашей модели, и если вы ответите или обновите вопрос своей структурой, я обновлю свой ответ, чтобы рассмотреть соответствующее решение.

Update: В зависимости от того, как 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'), 

Update 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

Pls сообщит мне, если вам нужна дополнительная информация – testndtv

+0

Обновлено. Дайте мне знать, если у вас есть какие-либо вопросы. – maffews

Смежные вопросы