Ember的做法是什么?
App.IndexController = Ember.Controller.extend({
actions: {
change: function(){
var model = this.get('model');
model[0] = true;
this.set('model', model);
}
}
});
我想在模型中切换元素(在此示例中为索引0)。
这是jsbin:http://emberjs.jsbin.com/doyejipagu/1/edit。对模型的更改没有得到反映。
答案 0 :(得分:3)
解决方案是使用replace
修改数组:
change: function(){
this.get('model').replace(0, 1, [true]);
}
见http://emberjs.com/api/classes/Ember.MutableArray.html#method_replace。上述方法是从位置0开始,用单个元素true
"替换1个元素。 replace
通知Ember数组内容已更改,因此它会反映在任何地方。
如果有一个replaceAt
API,那就太好了,我们只能说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
已经改变了,并且发挥了它的所有魔力。
答案 1 :(得分:-2)
您尝试做的事情是不可能的。模型必须是对象或对象数组,否则您无法在其上设置属性。
所以你可以这样做:
App.IndexRoute = Ember.Route.extend({
model: function() {
return [
Ember.Object.create({value: false}),
Ember.Object.create({value: true}),
Ember.Object.create({value: false})
];
}
});
App.IndexController = Ember.Controller.extend({
actions: {
change: function(){
this.get('model')[0].toggleProperty('value');
}
}
});