这是一个由两部分组成的问题,与操纵Angular中数据数组中的元素有关。看起来很普遍的方法是从ViewModel中的数组中删除元素是
$scope.array.splice(index, 1);
这对我来说似乎有些不稳定,我更喜欢Knockout如何处理with .remove
and observable arrays:vm.array.remove(item)
。
我发现你可以做得更好一点:
$scope.array.splice($scope.array.indexOf(item), 1);
但它更详细,.indexOf
可能无法正常工作,具体取决于item
是什么。
是否有任何Angular构造允许您通过其值轻松地从数组中删除项目?
同样基于this video from Egghead.io,删除ViewModel方法中的依赖关系而不依赖于范围是有意义的。是否优先传入您正在删除项目的数组:
<input type=submit ng-click="remove(array, item)">
array.splice(array.indexOf(item), 1)
或者是否有理由更喜欢在remove方法中使用$scope
(或控制器)?
答案 0 :(得分:1)
不幸的是,或者幸运的是,Knockout的表现与我们使用Angular的方式相同,即splice
方法
如果查看淘汰库中的observableArray.remove(item)
源代码 -
'remove': function (valueOrPredicate) {
var underlyingArray = this.peek();
var removedValues = [];
var predicate = typeof valueOrPredicate == "function" && !ko.isObservable(valueOrPredicate) ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
for (var i = 0; i < underlyingArray.length; i++) {
var value = underlyingArray[i];
if (predicate(value)) {
if (removedValues.length === 0) {
this.valueWillMutate();
}
removedValues.push(value);
underlyingArray.splice(i, 1);
i--;
}
}
if (removedValues.length) {
this.valueHasMutated();
}
return removedValues;
}
它做同样的事情,它解析数组并比较给定的值并执行splice
。
他们为此编写了可重复使用的模块,以便于开发人员使用。我相信你可以通过在Angular代码中编写自定义指令来做同样的事情。您可以使用上面的代码作为参考。只是Angular没有任何可重复使用的指令......但是......我们可以在制作之后请求拉取请求: - )
但你的问题非常好,应该有一个可重复使用的模块。