Подтвердить что ты не робот

В чем разница между свойством "[]" и "@each" в ember.js?

Я заметил, что перечислимый mixin имеет вычисленные свойства, которые зависят от свойства '[]', в то время как массивы ember также имеют свойство '@each'.

В чем разница между значениями '[]' и '@each'?

Мое смутное понимание (исправьте меня, если я ошибаюсь) заключается в том, что '[]' запускается при замене содержимого массива. Но отличается ли это от самого свойства?

Рассмотрим следующий класс:

C = Ember.Object.extend({
  things: null,
  watcher1: (function() {
    console.log('watcher1')
  }).observes('things.[]'),
  watcher2: (function() {
    console.log('watcher2')
  }).observes('[email protected]')
});

И создаю экземпляр следующим образом:

c = C.create({things: Ember.A(['a', 'b'])});

Следующее:

c.get('things').replace(0, 1, ['z'])

триггеры watcher1 и watcher2

И следующее:

c.get('things').setObjects(['1', '2'])

также запускает watcher1 и watcher2

Как и:

c.get('things').addObject('v')

Так есть какая-то разница? Когда мы должны использовать один против другого?

Спасибо! Кевин

4b9b3361

Ответ 1

Используйте @each, если вам нужно наблюдать свойства элементов массива

@each поддерживает наблюдаемые свойства элементов внутри массива. Например, [email protected]. Обозначение скобок не поддерживает это. Вот демонграмма jsbin.

@each - это свойство экземпляров Array, которое возвращает экземпляр EachProxy, который обрабатывает делегация. С другой стороны, [] просто возвращает this.

Используйте [], если вам нужно, чтобы он работал с перечислениями без массива

В соответствии с измененным списком изменений, нотация скобок была уменьшена в пользу @each в ember 0.9.4, но затем снова включена в 0.9.8. Конец, который повторно активирует его, указывает, что [] может использоваться для перечислений, отличных от Array, таких как экземпляры Ember.Set. jsbin demo.