2016-11-11 17 views
0

比方說,例如,我們有父元素和相應的子元素。 所以,我有一個父類,並在JavaScript子類:淘汰賽,映射插件將子節點追加到父元素

//類來表示父

function parent(data) { 
    this.Id = ko.observable(data.Id); 
    this.Name = ko.observable(data.Name); 
    this.children = ko.observableArray([]); 
} 

//類代表一個孩子

function child(data) { 
    this.Id = ko.observable(data.Id); 
    this.Name = ko.observable(data.Name); 
    this.Age = ko.observable(data.Age); 
    this.ParentID = ko.observable(data.ParentID); 
} 

其實,我能夠通過做與每個父母相關的兒童附加

Jquery.getJSON("/api/parents", function (allData) { 
     var mappedParents = Jquery.map(allData, function (item) { 
      return new parent(item) 
     }); 
     self.parents(mappedParents); 

     // Get Children and attach them to the corresponding parent 
     Jquery.getJSON("/api/children", function (allData) { 
      var mappedChildren = Jquery.map(allData, function (item) { 
      return new child(item) 
     }); 
     self.children(mappedChildren); 

     ko.utils.arrayForEach(mappedChildren, function (dataChildren) { 
      var children_ParentID = dataChildren.ParentID(); 
      ko.utils.arrayForEach(self.parents(), function (parent) { 
       if (parent.Id() == children_ParentID) { 
        parent.children.push(new child(dataChildren)); 
       } 
      }); 
     }); 
    }); 

    }); 

和I f最終得到一個Json,其中包含與每個父代相關的可觀察的兒童數組。

parent : 
[ 
    { 
     "Id": 1, 
     "Name": "Parent1", 
     "children": [ 
      {"Id": 1, "Name": "Child11", "Age": "11", "ParentID": 1}, 
      {"Id": 2, "Name": "Child12", "Age": "12", "ParentID": 1}, 
      {"Id": 3, "Name": "Child13", "Age": "13", "ParentID": 1} 
     ] 
    }, 
    { 
     "Id": 2, 
     "Name": "Parent2", 
     "children": [ 
      {"Id": 4, "Name": "Child11", "Age": "21", "ParentID": 2}, 
      {"Id": 5, "Name": "Child12", "Age": "22", "ParentID": 2} 
     ] 
    } 
] 

所以,你可以看到,我能夠通過一個嵌套循環

foreach parents 
{ 
    var idParent = Id; 
    foreach children 
    { 
     if chidren.parentId == idParent then attach children 
    } 
} 

兒童附加到給定父但是,我敢肯定,有可能是一個更好的辦法做到這一點,這是更有效的。例如,映射插件?或更好的東西?因爲如果數據量很大,可能需要一段時間才能將所有孩子拉到每個家長身上。

回答

0

以下方法建議首先讓所有的孩子,然後得到所有的父母。然後從原始的兒童數組中篩選特定父級的子級。

var parent = function(data) { 
    var myself = this; 
    this.Id = ko.observable(data.Id); //I assume this is same as the parentId property in a child object. 
    this.Name = ko.observable(data.Name); 
    this.children = ko.observableArray(self.getChildByParentId(this.Id)); 
} 

var child = function(data) { 
    var myself = this; 
    this.Id = ko.observable(data.Id); 
    this.Name = ko.observable(data.Name); 
    this.Age = ko.observable(data.Age); 
    this.ParentID = ko.observable(data.ParentID); 
} 

self.getChildByParentId = function(parentId) { 
    var children = ko.utils.ArrayFilter(self.children(), function(child) { 
    return child.ParentId === parentId; 
    }); 
    return children; 
} 

Jquery.getJSON("/api/children", function(allData) { 
    var mappedChildren = Jquery.map(allData, function(item) { 
    return new child(item); 
    }); 
    self.children(mappedChildren); 
}); 

Jquery.getJSON("/api/parents", function(allData) { 
    var mappedParents = Jquery.map(allData, function(item) { 
    return new parent(item); 
    }); 
    self.parents(mappedParents); 
}); 

我現在還不能確定這是否是你所期望的一個答案,但還是可以給出一個鏡頭......

+0

感謝您的答覆。我必須把** Jquery.getJSON(「/ api/children」,函數(allData){..} **裏面** Jquery.getJSON(「/ api/parent」,函數(allData){..} * *否則我的屏幕並不總是顯示父元素以及子元素,有時候它會,有時候不會!但是可能是,每次我想讓孩子與給定父代相關時,我必須查詢數據庫,而不是我將嘗試 – TonyStack

+0

我假設這些api調用彼此獨立....反正,您何時實際獲取子數據實際上取決於基礎業務邏輯.................. – gkb

+0

我強烈建議你使用maping插件,我用了很多年,並且幫了我很多。 –