2015-09-09 2 views
2
export default Ember.Object.extend({ 
    myArray: Ember.A([null,null,null]), 
    someFunction: function() { 
     console.log('i am triggered'); 
     myArray[1] = 3; 
    }.on('init'), 
    hasValue: Ember.observer('myArray.[]', function() { 
     console.log('i am changed'); 
    }) 
}) 

Какая ошибка? Функция наблюдателя никогда не срабатывает, хотя всегда достигает someFunction.Ember Array observer не работает

ответ

2

Использование myArray.[] будет уведомлять вас только о том, когда элементы добавляются или удаляются из массива. Правильный способ сделать это - использовать [email protected], который будет наблюдать за всеми изменениями свойства key для каждого элемента массива.

Если я честен, я на самом деле не знаю, как наблюдать массив примитивов изменений (для добавленных/удаленных изменений, за исключением), так что, вероятно, сделать что-то вроде:

myArray: Ember.A([Ember.Object.create(), Ember.Object.create(), Ember.Object.create()]); 

myArray[1].set('id', 3); 

И затем просмотрите [email protected]. Если вы хотите, чтобы спроецировать эти идентификаторы можно использовать mapBy:

ids: Ember.computed.mapBy('myArray', 'id') 

Я надеюсь, что это помогает!

+0

aaah .... thats больше не массив. Сначала мы уходим от массива к Ember.A(), а затем внутри, что мы создаем больше ember объектов! –

+0

Я не думаю, что вам нужно использовать 'Ember.Array', но вам (возможно) нужно использовать объекты ember, если вы хотите наблюдать изменения в элементах. – jonnii

+0

Иногда весь код не находится под контролем одного человека :) Я вынужден использовать массивы по разным причинам. –

2

Использование MutableArray#replace:

this.get('myArray').replace(1, 1, [3]); 

Это означает, что: начиная с индекса 1, заменить 1 элемент с 3. Это вызывает все необходимые зависимости и наблюдатели, определенные как myArray.[].

Я удивлен, что ваш код не выплевывает ReferenceError, так как вы имеете в виду необъявленную переменную myArray внутри someFunction.

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

+0

Не существует ли определенный способ ember для добавления наблюдателя к примитивному объекту массива, кроме этого? –

+1

Если я правильно понял ваш вопрос, нет. Это вы просто меняете элемент массива напрямую, У Эмбера нет способа обнаружить это или ответить на него. Он знает только, как запускать все свои наблюдатели и зависимые свойства, когда вы используете API, которые позволяют это делать. В какой-то момент в будущем, когда 'Object.observe' реализован повсюду, и Ember поддерживает его, это может и измениться. Как бы то ни было, мы застряли на сайтах 'this.get ('foo')' и 'notifyPropertyChange' и' addObject' еще несколько лет. –

+0

Это тот же случай для Ember.A ([1,2,3,4])? Не собственный массив, а массив Ember? –