这一直是我无尽痛苦的原因,希望有人能给我指出正确的方向。我参与的第一个Ember.JS项目。
基本上我有一堆"问题"模型。简而言之就是:
App.Question = DS.Model.extend({
title: DS.attr('string'),
answers: DS.attr('array'),
chosen_answers: DS.attr('array'),
});
Answers是一个数组。由于默认情况下没有DS.attr('array'),因此我通过以下方式定义它:
/* Register 'array' data type */
DS.ArrayTransform = DS.Transform.extend({
deserialize: function(serialized) {
return (Ember.typeOf(serialized) == "array")
? serialized
: [];
},
serialize: function(deserialized) {
var type = Ember.typeOf(deserialized);
if (type == 'array') {
return deserialized
} else if (type == 'string') {
return deserialized.split(',').map(function(item) {
return jQuery.trim(item);
});
} else {
return [];
}
}
});
App.register("transform:array", DS.ArrayTransform);
无论如何,答案数组被填充为(重要位…)(title, is_active)的关联数组。当选择了答案时,Is_active被设置为true。
问题模型保存了一个答案数组。在我的模板中,当我单击呈现的答案之一时,我向QuestionController发送一个操作。在这个动作中,我希望能够做到:
this.set('answers[0].is_active', true);
(显然用正确的索引替换'0',但这对这个问题并不重要)。
我认为我最接近的是:
var answers = this.get('answers');
answers[0].is_active = true;
this.set('answers', answers);
但是这不会更新{{#if this。模板中的handlebars帮助器。奇怪的是,如果我启动动作,导航"后退",然后导航"前进",{{#如果这个。Is_active}} helper呈现正确
这让我困惑了好几天。
你可能会绊倒,因为你设置一个属性不使用Ember的get
/set
,如果你只是设置它使用foo。属性烬没有办法捕捉属性已经改变的事实。因为我猜答案本身不是一个烬对象,你仍然可以使用Ember.set(obj, 'property', value)
和任何观察者观察将被通知属性已经改变。
var answers = this.get('answers'),
answer = answers.objectAt(0);
Ember.set(answer, 'is_active', true);