创建具有状态的对象数组

时间:2014-02-15 11:01:32

标签: knockout.js

我在knockoutjs中有一个层次结构。这种结构可以达到N深,但在日常使用中它不会超过4深。它大致看起来像这样。

var model = function(){
    self.Id = ko.observable();   
    self.Status = ko.observable();
    self.Children = ko.oberservaleArray();
}

我想创建一个计算函数,它为我提供了一个特定状态的模型对象的平面列表。

我会这样做只有一个级别。

self.SomeStatus = ko.computed(function() {
     ko.utils.arrayMap(self.Children(), function(item) {
         if(item.Status() === "SomeStatus")
             return item;
     });
}

如何实现这一点来返回具有相同状态的N级深度模型数组?

提前致谢。

1 个答案:

答案 0 :(得分:0)

只需创建一个遍历树的递归函数,并将每个节点添加到数组中,类似于以下内容:

self.items = ko.observableArray();
function flattenList(flattenedList, currentChildList){
    var childCount = currentChildList.length;
    for (var i = 0; i < childCount; i++){
        flattenedList.push(currentChildList[i]);
        flattenList(flattenedList, currentChildList[i].children());
    }
}
this.flattenedList = ko.computed(function(){
    var flattenedList = [];
    flattenList(flattenedList, self.items());
    return flattenedList;
});

这种情况下的孩子由ItemViewModel定义,如下所示:

function ItemViewModel(name){
    var self = this;

    self.name = name;
    self.children = ko.observableArray();
}

请注意,每当items可观察或任何children可观察量发生变化时,它都会遍历整个树。我为它写了一个jsfiddle,你可以在http://jsfiddle.net/T42LV/找到它。