Решение использовать replace
изменить массив:
change: function(){
this.get('model').replace(0, 1, [true]);
}
См http://emberjs.com/api/classes/Ember.MutableArray.html#method_replace. Вышеупомянутое означает «начиная с позиции 0, заменить 1 элемент, на один элемент true
». replace
уведомляет Ember о том, что содержимое массива изменилось, поэтому оно отражается повсюду.
Было бы неплохо, если бы был API replaceAt
, что позволило нам просто сказать model.replaceAt(0, true)
, но нет. Конечно, вы можете написать свой собственный:
Ember.MutableArray.reopen({
replaceAt: function(pos, val) {
return this.replace(pos, 1, [val]);
}
});
Проблема с кодом, что ничто не предупреждает Ember о том, что внутренние значения модели изменились. model[0] = true
ничего не запускает. Ваш this.set('model', model)
не изменяет значение самого объекта model
; поэтому он не вызывает никаких наблюдателей или привязок.
Вы также можете создать новый массив (здесь с помощью slice
), которая будет работать:
var model = this.get('model').slice();
model[0] = true;
this.set('model', model);
Теперь Ember видит, что model
изменилось, и делает всю свою магию.
Собственно, это неверно. Модель может быть любой. Это просто свойство со значением. Нет причин, по которым модель не может быть простым старым массивом с одиночными значениями. Фактически, приложение Ember hello world по умолчанию использует модель '['red', 'blue', 'yellow']'. –
Вы правы, моя формулировка была немного мусором, я имел в виду, что у ember не наблюдается никаких изменений, как вы упомянули в своем решении. – jcbvm