У меня есть контроллер EmberJS со следующим вычисляемым свойством:
hasSelectedRequirements: Ember.computed('selectedRequirements.[]', function() {
console.log("this should get printed but it doesn't");
return this.get('selectedRequirements').length > 0;
}),
который устанавливает логический флаг, который я использую в шаблоне для условного отображения html.
У меня также есть кнопка, которая при нажатии принимает данные формы и помещает элемент в массив selectedRequirements, вызывая действие addRequirement
actions: {
addRequirement() {
...
// extract data from form and create the requirement variable
var selectedRequirements = this.get('selectedRequirements');
selectedRequirements.push(requirement);
this.set('selectedRequirements', selectedRequirements);
console.log(this.get('selectedRequirements')); // does print as expected
}
}
Если вместо этого я изменю функцию addRequirement на this, то обработчик функции вычисляемого свойства hasSelectedRequirements будет запущен, как ожидалось, и оператор console.log будет работать:
actions: {
addRequirement() {
...
// extract data from form and create the requirement variable
var selectedRequirements = this.get('selectedRequirements');
selectedRequirements.push(requirement);
// create a new, local array
var arr = new Array();
arr.push(1);
this.set('selectedRequirements', arr);
console.log(this.get('selectedRequirements')); // does print as expected
}
}
Кажется, что вычисляемые свойства Ember полагаются на наблюдаемый массив, являющийся совершенно другим массивом?
Проблема в том, что вычисляемое свойство не распознает, что элемент был добавлен в массив selectedRequirements, а функция вычисляемого свойства никогда не вызывается (оператор console.log никогда не запускается). Почему вычисляемое свойство не распознает, что массив selectedRequirements был изменен, и как исправить код вычисленного свойства?
hasSelectedRequirements: Ember.computed.bool('selectedRequirements.length')
? Кстати, используйтеpushObject
, а неpush
. - person   schedule 07.07.2016