Javascript KnockoutJS无法从ObservalArray中删除对象
我有以下代码:Javascript KnockoutJS无法从ObservalArray中删除对象,javascript,arrays,knockout.js,Javascript,Arrays,Knockout.js,我有以下代码: var testVM = { things: ko.observableArray([ { id: 1, name: "Apple" }, { id: 2, name: "Banana" }, { id: 3, name: "Orange" }, { id: 4, name: "Pineapple" }, { id: 5, name: "Pear" } ]), deleteThing: function (data) {
var testVM = {
things: ko.observableArray([
{ id: 1, name: "Apple" },
{ id: 2, name: "Banana" },
{ id: 3, name: "Orange" },
{ id: 4, name: "Pineapple" },
{ id: 5, name: "Pear" }
]),
deleteThing: function (data) {
var things = testVM.things;
var index = things.indexOf(data);
// Debug...
console.log('data', data);
console.log('index', index);
if (index > -1) {
things.splice(index, 1)
}
},
deleteApple: function () {
this.deleteThing({ id: 1, name: "Apple" });
}
};
ko.applyBindings(testVM);
var x = { id: 1, name: "Apple" };
var y = { id: 1, name: "Apple" };
alert(x === y): // Alerts false
使用HTML:
<ul data-bind="foreach: things">
<li>
<a data-bind="click: $root.deleteThing">X</a> |
<span data-bind="text: name"></span>
</li>
</ul>
<a data-bind="click: deleteApple">Delete Apple</a>
-
. 我遇到的问题是,当在
foreach
中从data bind=“click:deleteothing”
调用时,deleteothing
函数可以正常工作,但是如果(在deleteApple
方法的情况下)我试图手动删除一些它从未找到索引的内容,并且随后不会从observableArray
中删除该项目
我被难住了,因为在这两种情况下,console.log
显示相同的数据。您遇到的问题与对象引用有关。在deleteApple
函数中,您正在传递一个与原始对象引用不匹配的新对象
remove
API确实接受一个传递项目的函数,您可以在其中返回truthy/falsy以确定是否要删除该项目
在observableArray上使用remove
的示例:
deleteApple: function () {
this.things.remove(function(item) {
return item.id === 1 && item.name === "Apple";
});
}
更新的fiddle:您遇到的问题与对象引用有关。在deleteApple
函数中,您正在传递一个与原始对象引用不匹配的新对象
remove
API确实接受一个传递项目的函数,您可以在其中返回truthy/falsy以确定是否要删除该项目
在observableArray上使用remove
的示例:
deleteApple: function () {
this.things.remove(function(item) {
return item.id === 1 && item.name === "Apple";
});
}
更新的fiddle:原因是您试图删除不在数组中的对象:
this.deleteThing({ id: 1, name: "Apple" });
虽然属性的值相同,但对象不同。对象是引用,您需要正确的引用,即需要查找项目的索引,然后在该索引处删除:
for(var i = 0;i<testVM.things.length;i++){
if(testVM.things[i].id === 1){
things.splice(index, 1);
}
}
原因是您试图删除不在数组中的对象:
this.deleteThing({ id: 1, name: "Apple" });
虽然属性的值相同,但对象不同。对象是引用,您需要正确的引用,即需要查找项目的索引,然后在该索引处删除:
for(var i = 0;i<testVM.things.length;i++){
if(testVM.things[i].id === 1){
things.splice(index, 1);
}
}
谢谢瑞安,我知道会在这里见到你:)谢谢瑞安,我知道会在这里见到你:)