2013-12-09 65 views
2


我有一個對象與此結構如何用遞歸對象extjs填充商店?

第一 最後 UID ID RELS []

RELS是包含同樣具有相同的結構對象的陣列。 我如何管理這個對象的方式來填充一個treeStore在負載中使用extjs?我需要保持母體之間的層次結構,並童車

例如


        child1
       的child2
                nephew1
                nephew2

等。它們都在父節點下。

有什麼建議嗎?我嘗試了幾種使用遞歸函數但沒有結果的方法。


這是我的代碼(不工作)

Ext.define('utenti', {
extend: 'Ext.data.Model', fields: [ {name:'F', type: 'string'}, {name:'L', type: 'string'}, {name:'Uid', type: 'string'}, {name:'Id', type: 'string'} ] });

 var TreeUserStore = Ext.create('Ext.data.TreeStore', { 
      model: 'utenti', 
      root: 
       { 
       text: 'Root', 
       //id: 'Radice_utenti', 
       expanded: true 
       }, 
      listeners:{ 

       load: 
        function eachRecursive(ResObj){ 
         var childNode; 
         if(ResObj.Rels.length > 0){ 
          for (i=0; i<data.Rels.length;i++){ 
           eachRecursive(ResObj.Rels[i]); 

          } 
         } 
         else{ 
          childNode = Ext.create('utenti',{ 
           F: ResObj.F, 
           L: ResObj.L, 
           Uid: ResObj.Uid, 
           Id: ResObj.Id 
          }); 
          TreeUserStore.appendChild(child); 
         }          
        } 

由於事先

編輯:

我發現,從對象中提取數據的功能

函數eachRecursive(ResObj,pare NT){

if(ResObj.Rels.length > 0) { var childNodeModel = { name: ResObj.F + " " +ResObj.L, text: ResObj.F + " " +ResObj.L, leaf: false, children: [] }; alert("padre:" + parent.name + ", figlio:" + childNodeModel.name); parent.children.push(childNodeModel); for(var i=0; i<ResObj.Rels.length; i++){ eachRecursive(ResObj.Rels[i], childNodeModel); } } else { var childNodeModel = { name: ResObj.F + " " +ResObj.L, text: ResObj.F + " " + ResObj.L, leaf: true }; alert("padre:" + parent.name + ", figlio:" + childNodeModel.name); parent.children.push(childNodeModel); } }

但此刻我不是能夠在TreePanel中顯示的元素。我試圖使用appendChild但沒有任何結果,我也嘗試創建TreeNode,但它給我和錯誤,如'對象不是一個函數'。

我該怎麼辦?

回答

2

您應該使用appendChild節點的方法來將子節點添加到層次結構中。

您的遞歸函數所以應該是這樣的:

 function eachRecursive(ResObj, parent){ 

      if(ResObj.Rels.length > 0) 
      { 

       var childNodeModel = { 
        name: ResObj.F + " " +ResObj.L, 
        text: ResObj.F + " " +ResObj.L, 
        leaf: false, 
        children: [] 
       }; 

       var childNode = parent.appendChild(childNodeModel); 

       for(var i=0; i<ResObj.Rels.length; i++){ 
        eachRecursive(ResObj.Rels[i], childNode); 
       } 
      } 
      else 
      { 
       var childNodeModel = { 
        name: ResObj.F + " " +ResObj.L, 
        text: ResObj.F + " " + ResObj.L, 
        leaf: true 
       };     
       parent.appendChild(childNodeModel); 

      } 
     } 

,你開始從根填充店:

eachRecursive(data, TreeUserStore.getRootNode()); 
+1

謝謝akatum,它完美的作品! 我只做了一些小的變化: 在函數中,我將變量childNode聲明爲「var childNode」,因爲否則所有在父項之後的子項都將放在它下面,失去它的真正父項(我不知道它是否清除..)。另一個改變是電話,我用 eachRecursive(data,TreeUser.getRootNode()); – Erik

+0

不客氣。是的,我錯誤地將變量聲明爲全局變量,我已經解決了這個問題。 – Akatum

1
Ext.override(Ext.data.TreeStore, { 
      appendChildRecusive: function (nodeTarget, itemsJson) { 
       for (i in itemsJson) { 
        var newNode = nodeTarget.createNode(itemsJson[i]); 

        if (i != 'hasObject') 
         nodeTarget.appendChild(newNode); 

        if (itemsJson[i].children != undefined) 
         this.appendChildRecusive(newNode, itemsJson[i].children); 
       } 
      } 
     });