按值删除元素a-la Knockout
Remove element by value a-la Knockout
这是一个由两部分组成的问题,它与在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没有任何可重用的指令……然而. .也许我们可以在发出拉取请求后再请求:-)
但是你的问题很好,一个人应该有这样的可重用模块。
相关文章:
- 无法获取属性'Id'使用Knockout.js的未定义或空引用API
- 如何将Knockout.JS与服务器已经在DOM中呈现的数据同步
- 显示模块模式在Knockout中设置模型的新实例
- Knockout.JS标签在foreach内部不起作用
- 如何收集Knockout可观察性以放入JSON
- 使用Knockout JS从下拉框中向observalearray添加项
- 将JSON数据从服务器加载到knockout.jsobservable中
- Knockout绑定大量数据的速度较慢
- 使用knockout.js将数组绑定到视图模型
- Knockout observable没有观察到其中一个属性
- 如何使用Jasmine测试Knockout.js点击绑定
- 类似于Prism的Knockout js框架
- Knockout JS和简单的函数
- Knockout映射创建/更新出现问题
- 使用带HTML按钮的Knockout
- Knockout绑定是膨胀的html(表单元格),如何使用javascript创建绑定或从父元素绑定
- Knockout.js中带有if:子句的嵌套循环
- Knockout JS中具有下拉列表的数组
- 在Knockout中绑定数据后获取数据
- 按值删除元素a-la Knockout