2014-02-15 281 views
0

我在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

只是做一個遞歸函數,走過你的樹,每個節點添加到一個數組,類似於以下內容:

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(); 
} 

請注意,每當可觀察值或任何可觀察值變化時,它都會遍歷整棵樹。我寫了一個jsfiddle,你可以在http://jsfiddle.net/T42LV/找到。

+0

當然,只需在for循環中添加一個過濾器,確保它只會推送那些具有您要查找狀態的項目。 –