在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
必须按顺序实现使用,但我不太明白我应该在哪里实现它,我还没有找到任何示例实现来指导我。
我还尝试过各种其他方法,例如removeObject
,removeObjects
等等,但没有一种做到我需要的。
答案 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);
}
}
}