KnockoutJS不能从observableArray中删除对象
KnockoutJS cannot delete object from observableArray
我有以下代码:
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);
与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: deleteThing"
调用deleteThing
函数时工作正常,但是如果(在deleteApple
方法的情况下)我试图手动删除一些东西,它永远找不到索引,随后不会从observableArray
中删除项目。
我被难住了,因为在这两种情况下console.log
显示相同的数据
您遇到的问题与对象引用有关。在你的deleteApple
函数中,你传递了一个与原始对象引用不匹配的新对象。
remove
API接受一个传递item的函数,在这个函数中你可以返回true/false是否你想要删除这个item。
在observableArray上使用remove
示例:
deleteApple: function () {
this.things.remove(function(item) {
return item.id === 1 && item.name === "Apple";
});
}
更新小提琴:http://jsfiddle.net/rniemeyer/5HPxZ/
原因是您试图删除一个不在数组中的对象:
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);
}
}
要测试我对引用的意思,试着执行以下代码:
var x = { id: 1, name: "Apple" };
var y = { id: 1, name: "Apple" };
alert(x === y): // Alerts false
相关文章:
- 解析JSON并从中删除对象会出错
- 在特定条件下从存储在localStorage中的阵列中删除对象
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 正在从列表中删除对象
- 删除对象时终止setInterval
- 在JavaScript中高效地删除对象
- 使用javascript(ajax,jquery?)从表中删除对象(用户等)
- 从范围中删除对象时,它会在 Angularjs 中隐藏其余对象
- 如何正确地从数组中删除对象
- 捕捉.svg — 单击其中一个元素时删除对象
- 如何删除对象数组中的对象:jquery
- 下划线.js,根据键值删除对象数组中的重复项
- 如何在Immutable中从数组中删除对象
- 删除对象属性在执行删除操作之前生效
- 使用indexOf从列表中删除对象
- 从数组中删除对象
- 如何使用.bind(this)删除对象的事件侦听器
- 正在创建事件侦听器以从本地存储中删除对象
- 如何通过引用(javascript)从数组中删除对象
- 如何按条件删除对象中的对象