如何从Ember.ArrayController中删除元素

时间:2014-05-07 21:00:08

标签: ember.js

在JavaScript中,可以通过以相反的顺序遍历它并使用splice(index, 1)删除不需要的元素来从数组中删除所选元素。我试图弄清楚如何在Ember.js中做同样的事情(没有Ember数据)。

我有一个ArrayController,相关的Route' model函数只返回一个JavaScript数组。控制器中有一个动作,沿着以下几行:

removeElements: function () {
  var i, arr = this.get('content'),
    i = arr.length;

  while (i) {
    i -= 1;
    if (arr[i].get('flag')) {
      array.replace(i, 1);
  }
}

这首先出现在浏览器中。例如,如果我有三个元素并标记要删除的第一个和第三个元素,则浏览器将显示第二个项目。但是,如果我后来尝试标记后者,Ember会抱怨Uncaught Error: Can't remove an item that has never been added.

我使用了replace(),因为Ember数组没有splice方法,但文档也说replace 必须按顺序实现使用,但我不太明白我应该在哪里实现它,我还没有找到任何示例实现来指导我。

我还尝试过各种其他方法,例如removeObjectremoveObjects等等,但没有一种做到我需要的。

1 个答案:

答案 0 :(得分:1)

您需要创建自己的数组集合并在该集合上实现替换(可能会扩展Ember.Array以帮助您入门)。

removeObject应该可以正常工作(虽然这个列表的大小很小但可以忽略不计,但是效率有点低):

removeElements: function () {
  var controller = this,
      list = this.toArray();

  list.forEach(function(item){
    if(item.get('flag')){
      controller.removeObject(item);
    }
  });
}

使用removeAt可以为您提供正在寻找的结果

removeElements: function () {
  var i = this.get('length');

  while (i--) {
    if (this.objectAt(i).get('flag')) {
      this.removeAt(i);
    }
  }
}