数组中的灰烬切换元素

时间:2015-04-18 22:04:09

标签: ember.js

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。对模型的更改没有得到反映。

2 个答案:

答案 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');
        }
    }
});