按值删除元素a-la Knockout

Remove element by value a-la Knockout

本文关键字:a-la Knockout 元素 删除      更新时间:2023-09-26

这是一个由两部分组成的问题,它与在Angular中操作数据数组中的元素有关。从ViewModel中删除数组元素的方法似乎很普遍

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

这对我来说似乎有点不稳定,我更喜欢Knockout如何处理.remove和可观察数组:vm.array.remove(item)

我发现你可以这样做,这是更好一点:

$scope.array.splice($scope.array.indexOf(item), 1);

但是它更冗长,.indexOf可能不像你期望的那样工作,这取决于item是什么。

在Angular中有没有什么结构可以让你轻松地根据数组的值从数组中删除一个元素?

也是基于Egghead的这个视频。因此,删除ViewModel方法中的依赖关系而不依赖于作用域是有意义的。是否更愿意传递要从中删除项的数组:

<input type=submit ng-click="remove(array, item)">
array.splice(array.indexOf(item), 1)

或者是否有理由更喜欢在remove方法中使用$scope(或控制器)?

不幸或幸运的是,Knockout采用了与Angular相同的方式,即splice方法

如果您查看knockout库中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没有任何可重用的指令……然而. .也许我们可以在发出拉取请求后再请求:-)

但是你的问题很好,一个人应该有这样的可重用模块。