2016-02-28 3 views
1

Скажем, у меня есть процедура hasMany отношения => hasMany шаги, с асинхронным: верно, и у меня есть процедура компонент (о порядке маршрута) под названием процедура магистральных, в котором перечислены шаги, как так:Ember.js 2.3 реализовать @ each.property observer в отношениях HasMany?

{{#each steps as |step| }} 
{{step.title}} 
{{/each}} 

Мне нужно наблюдать свойство на каждом шаге (скажем, stepStatus) при изменении на stepStatus на любом из шагов. В Ember 1.7, у меня было что-то вроде этого на контроллере процедуры:

stepsStatusObserver: function(){ 
... 
}.observes('[email protected]') 

Это был уволен по изменению stepStatus на любом на ступеньках, и все, что я в этой функции был уволен, когда состояние изменилось. Однако в Ember 2.3 я не могу это реализовать. Я пробовал с

stepsStatusObserver: Ember.observer('steps.[].stepStatus', function(){ 
... 
}) 

но это только срабатывает один раз, когда шаги перечислены на странице. Когда я изменяю статус одного шага на новое значение, функция никогда не запускается.

Как я могу повторить эту функцию в Ember 2.3?

Примечание: в моем случае я не могу полагаться на ручную настройку функции внутри наблюдателя одним нажатием кнопки, поскольку она должна автоматически запускаться, если свойство stepStatus было изменено на любом шаге.

+0

Также возможно, что ваша область не соответствует действительности, в вашем шаблоне используется 'procedure.steps', хотя в вычисленном вами свойстве вы ссылаетесь на« шаги ». Без дополнительной информации это просто догадка. – Kingpin2k

+0

Во всяком случае, 'шаги. []. StepStatus' не является рабочим синтаксисом. – locks

+0

Приносим свои извинения за типографию: это шаги как шаг | на моем .hbs, я сделал опечатку в вопросе. Он исправлен в редактировании. – Darshan

ответ

12

Проблема заключается в том, что steps.[].stepStatus не является допустимым зависимый ключ больше. Вы должны заменить его на [email protected].

Вот краткое изложение действительных и недействительных зависимых ключей в текущей версии Поста:

  • array - это замечает, если массив ссылки меняется сам, например, заменив весь массив с другим значением или массивом, например, как oldValue !== newValue ,
  • array.[] - это замечает и когда сам массив изменяется (выше), и при изменении длины массива (функционально эквивалентное из array.length)
  • [email protected] - отмечает оба случая выше и, когда property некоторых из элементов массива изменить
  • [email protected]{prop,anotherProp} - вы также можете наблюдать несколько свойств, указав только один ключ. Это увеличивается до [email protected] и [email protected].
  • [email protected] - больше не действителен, не имеет заднего конца @each. Вместо этого используйте .[].
  • [email protected] - Также не является действительным. Обратите внимание, что @each работает только на одном уровне. Вы не можете использовать вложенные формы, такие как [email protected] или [email protected]@each.name.
  • array.[].property - не действителен. Вместо этого используйте форму @each.
+0

Мне нравится великолепная деталь этого ответа; к сожалению, даже шаг. @ each.stepStatus не работает. Забавно, однако, когда маршрут загружен, для каждого шага наблюдатель один раз срабатывает. (до этого он запускался только один раз для всего маршрута). Но когда я изменяю stepStatus шага через действие, наблюдатель не срабатывает. Вот следующий вопрос: должен ли он быть простым массивом JS, или должен использоваться прецедент работы @ each.property с подклассом по умолчанию для прокси-сервера массива, который имеет у Ember для своих отношений hasMany? – Darshan

+0

Если это помогает, я все время показывал инструмент отладки ember для хром, и он определенно зарегистрировался, что статус целевого шага был изменен и что у него есть dirtyAttributes. Даже переключение наблюдателя на @ each.hasDirtyAttributes не срабатывает при изменении stepStatus. – Darshan

+0

В зависимости от варианта использования могут потребоваться массивы Ember. Можете ли вы воспроизвести проблему на ember-twiddle.com? – miguelcobain