Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KnockoutJS无法从ObservalArray中删除对象_Javascript_Arrays_Knockout.js - Fatal编程技术网

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>&nbsp;|&nbsp;
    <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);
        }
    }
    

    谢谢瑞安,我知道会在这里见到你:)谢谢瑞安,我知道会在这里见到你:)