[英]Knockout: Remove Array Item from Computed Observable
我有一个包含数组的computed
变量。 像这样:
self.MyArray = ko.computed(function() {
var source = [];
// Some Logic to Prepare Array
...
...
...
return source;
});
现在,在按钮单击事件上,我想从self.MyArray
删除Item。 但是我找不到任何可行的解决方案。
我尝试了这个:
self.MyArray.remove(currentRow);
但这会引发异常:
未捕获的TypeError:self.MyArray.remove不是一个函数
小提琴样本: 小提琴
您返回的是常规数组,而不是基因剔除的observableArray。 标准javascript数组没有删除功能。 在下面的示例中,我使用了通用的remove函数来解决您的问题。
var bar = "foo"; self.MyArray = ko.computed(function() { var source = []; source.push(bar); return source; }); function remove(array, element) { const index = array.indexOf(element); if (index !== -1) { array.splice(index, 1); } } console.log(self.MyArray()); // ["foo"] remove(self.MyArray(), bar); console.log(self.MyArray()); // []
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
如果要改为使用observableArray,则不需要额外的remove函数。 淘汰赛的observableArray已经有一个。 以下示例显示了如何删除它。
var bar = "foo"; self.MyArray = ko.computed(function() { var source = ko.observableArray(); source.push(bar); return source; }); console.log(ko.unwrap(self.MyArray())); // ["foo"] self.MyArray().remove(bar); console.log(ko.unwrap(self.MyArray())); // []
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
该代码需要进行一些更改。 我在下面列出了重要的几个:
Name
输入的绑定必须是双向的,以允许“ Add
按钮将文本推入NameList
数组。 您可以为此使用textInput
或value
绑定,而不是text
绑定。
<input type="text" data-bind="textInput: Name">
在将新项目添加到数组时,由于它是可观察到的,因此必须作为self.NameList.push(self.Name());
进行访问self.NameList.push(self.Name());
,而不是self.NameList.push(self.Name);
。
在remove函数中,您可以获取源元素的索引,然后将其删除。 就像是:
var idx = self.DataSource().indexOf(selectedData); self.NameList.splice(idx, 1);
这是更新的小提琴: http : //jsfiddle.net/afmn2keb/7/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.