В чем разница между свойством "[]" и "@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')
Так есть какая-то разница? Когда мы должны использовать один против другого?
Спасибо!
Кевин
Ответы
Ответ 1
Используйте @each
, если вам нужно наблюдать свойства элементов массива
@each
поддерживает наблюдаемые свойства элементов внутри массива. Например, [email protected]
. Обозначение скобок не поддерживает это. Вот демонграмма jsbin.
@each
- это свойство экземпляров Array, которое возвращает экземпляр EachProxy
, который обрабатывает делегация. С другой стороны, []
просто возвращает this
.
Используйте []
, если вам нужно, чтобы он работал с перечислениями без массива
В соответствии с измененным списком изменений, нотация скобок была уменьшена в пользу @each
в ember 0.9.4, но затем снова включена в 0.9.8. Конец, который повторно активирует его, указывает, что []
может использоваться для перечислений, отличных от Array, таких как экземпляры Ember.Set
. jsbin demo.