我在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级深度模型数组?
提前致谢。
答案 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/找到它。