Ember.js 数组中的余烬切换元素
余烬是如何执行以下操作的Ember.js 数组中的余烬切换元素,ember.js,Ember.js,余烬是如何执行以下操作的 App.IndexController = Ember.Controller.extend({ actions: { change: function(){ var model = this.get('model'); model[0] = true; this.set('model', model); } } }); 我想在模型中切换一个元素(本例中为索引0) 这是jsbin:。没有反映对模型的更改。您尝试
App.IndexController = Ember.Controller.extend({
actions: {
change: function(){
var model = this.get('model');
model[0] = true;
this.set('model', model);
}
}
});
我想在模型中切换一个元素(本例中为索引0)
这是jsbin:。没有反映对模型的更改。您尝试执行的操作是不可能的。模型必须是对象或对象数组,否则无法对其设置属性 例如,你可以这样做:
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');
}
}
});
解决方案是使用
replace
修改阵列:
change: function(){
this.get('model').replace(0, 1, [true]);
}
看。上面的意思是“从位置0开始,将1个元素替换为单个元素true
”replace
通知余烬数组内容已更改,因此它会到处反映
如果有一个replaceAt
API就好了,允许我们只说model.replaceAt(0,true)
,但是没有。当然,你可以自己写:
Ember.MutableArray.reopen({
replaceAt: function(pos, val) {
return this.replace(pos, 1, [val]);
}
});
代码的问题在于,没有任何东西会提醒Ember模型的内部值已更改<代码>模型[0]=true不触发任何内容。您的this.set('model',model)
不会更改model
属性本身的值;因此,它也不会触发任何观察者或绑定
您还可以创建一个新的数组(此处使用切片
),该数组可以:
var model = this.get('model').slice();
model[0] = true;
this.set('model', model);
现在,Ember看到
模型
发生了变化,并发挥了所有的魔力。事实上,这是不正确的。模型可以是任何东西。它只是一个有值的属性。模型没有理由不能是具有单个值的普通旧数组。事实上,默认的Ember hello world应用程序使用的模型是['red','blue','yellow']
。你是对的,我的公式有点垃圾,我的意思是Ember无法观察到你在解决方案中提到的任何变化。