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无法观察到你在解决方案中提到的任何变化。