2

我正在使用 KnockoutJS 并有一个多维可观察数组(对象?):

self.navItems = ko.observableArray([
    { name: "test1", children: [
        { name: "test1child1", children: [] },
        { name: "test1child2", children: [] }
    ]},
    { name: "test2", children: [] },
]);

我希望能够根据属性值删除其中一个对象。在其他作品中,我想做这样的事情:

removeNavItem("test1child2");

我编写了一个函数,但无法让它工作,因为它正在寻找“test1child2”作为属性,而不是值。

self.removeNavItem = function (itemName) {
    var item = ko.utils.arrayFirst(self.navItems(), function (item) {
        if (item.name === itemName) { // this seems to work correctly
            delete self.navItems[itemName]; // this doesn't, because it tests property, not value
        }
    });
};

jsfiddle链接

编辑:

我不知道 KO 内置的 remove/removeAll 方法。

感谢下面的评论者,我让它部分工作,但是当我尝试删除 children[] 内部的某些内容时,它也会删除整个父项。

removeNavItem = function (itemName) {
    var items = self.navItems.remove(function (item) {
        for (i = 0; i < item.children.length; i++) {
            if (item.children[i].name === itemName) {
                return item.children[i].name;
            }
        }
        return item.name === itemName;
    });
};

更新了 jsfiddle

4

3 回答 3

1

如果您希望能够在任何级别上使用它,请传入要从中删除它的数组:

self.removeNavItem = function (obsArray, itemName)
{
    obsArray.remove(function(item) { return item.name === itemName });
};

然后你可以在每个元素上调用它:

click: function() { $root.removeNavItem($parent.children, $data.name); }

我已经更新了你的jsfiddle,它可以工作,但你必须让所有子数组都成为可观察数组才能工作。

于 2013-03-12T15:08:51.023 回答
1

有一种更简单的方法可以做到这一点。Knockout 提供了一个remove()可以使用函数来移除匹配项的功能:

self.removeNavItem = function (itemName) {
    var items = self.navItems.remove( function (item) { 
        return item.name === itemName; 
    });
};

(在observableArrays 文档的“Remove and RemoveAll”部分提到)

于 2013-03-12T15:13:15.687 回答
1

我认为您将需要一个在 n 级递归上进行搜索的函数

 function del(obj,val){
   $.each(obj,function(i,j){
       if(j['name'] == val){
          delete(j);
          return false;
       }else if(j['children'].length!=0){
           del(j['children'],val);
         }
   })

 }

这个函数有两个参数你的对象和要搜索的值,你可以修改它以适应你的情况。

于 2013-03-12T15:21:28.433 回答