2014-02-15 3 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(); 
} 

Следует помнить, что он будет перебирать все ваше дерево каждый раз, когда наблюдаются наблюдаемые items или любые изменения наблюдаемых children. Я написал для него jsfiddle, который вы можете найти по адресу http://jsfiddle.net/T42LV/.

+0

Конечно, просто добавьте фильтр в цикл for, который гарантирует, что он просто нажимает те элементы, которые имеют статус, который вы ищете. –

Смежные вопросы