这对我来说是无尽痛苦的原因,希望有人可以指出我正确的方向。我参与的第一个Ember.JS项目。
基本上我有一堆问题'楷模。基本上简化版本是:
App.Question = DS.Model.extend({
title: DS.attr('string'),
answers: DS.attr('array'),
chosen_answers: DS.attr('array'),
});
答案是一个数组。由于默认情况下没有DS.attr('数组'),我已将其定义为:
/* 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.is_active}}把手助手。 奇怪的是,如果我触发操作,请导航'返回',然后导航'转发',{{#if this.is_active}}帮助器正确呈现。
这让我完全难过了好几天。任何指针都会受到大力赞赏。
答案 0 :(得分:1)
如果您只是使用Ember get
/ set
设置属性,那么您可能会绊倒,如果您只是使用foo.property设置它.Ember已经无法捕捉到财产发生变化的事实。由于我猜测答案本身并不是一个Ember对象,你仍然可以使用Ember.set(obj, 'property', value)
,任何观察者都会收到通知,告知该属性已经改变。
var answers = this.get('answers'),
answer = answers.objectAt(0);
Ember.set(answer, 'is_active', true);