按值a-la Knockout删除元素

时间:2014-08-12 19:32:45

标签: javascript arrays angularjs knockout.js

这是一个由两部分组成的问题,与操纵Angular中数据数组中的元素有关。看起来很普遍的方法是从ViewModel中的数组中删除元素是

$scope.array.splice(index, 1);

这对我来说似乎有些不稳定,我更喜欢Knockout如何处理with .remove and observable arraysvm.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(或控制器)?

1 个答案:

答案 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没有任何可重复使用的指令......但是......我们可以在制作之后请求拉取请求: - )

但你的问题非常好,应该有一个可重复使用的模块。