2013-04-15 44 views
2

的Ext JS 4.1如何從TreeStore Extjs4.1獲取數據

從 'Ext.data.Store' 獲得價值的數據,它只是使用

var data1 = store.data.items[0].data.fieldname; 

var data1 = store.getAt(0).data.fieldname; 

但在'Ext.data.TreeStore'中,此方法不起作用!

有什麼建議嗎?

回答

-1

這實際上是一個非常需要的功能。

考慮一下當你有一個帶有檢查列的樹形網格時,你正在監聽該列的「checkchange」事件,並且想要找到剛剛更改過的記錄。

不幸的是,所有ExtJS爲您提供的是一個記錄索引。 幸運的,雖然,沒有人從我們自己的商店定義我們自己的getAt方法阻止我們,不正是我們想要的:

{ 
    store: 'tree', 
    getAt: function (index) { 
    var current = 0; 
    return (function find(nodes) { 
     var i, len = nodes.length; 
     for (i = 0; i < len; i++) { 
     if (current === index) { 
      return nodes[i]; 
     } 
     current++; 
     var found = find(nodes[i].childNodes); 
     if (found) { 
      return found; 
     } 
     } 
    }(this.tree.root.childNodes)); 
    } 
} 
+0

隨着ExtJS的4.2.x版,通過checkchange事件傳遞的節點索引不算數摺疊節點的子節點。所以對於上面的代碼,我會得到錯誤的模型記錄。我只是在「current ++;」之後添加了「if(nodes [i] .isExpanded()){」...;「它似乎工作正常。雖然它似乎工作,我可能不會堅持這個代碼,因爲它似乎有點脆弱。 – nogridbag

8

這是Extjs常見的誤解。 Ext.data.TreeStore和Ext.data.Store實際上不是非常相似,既不從另一個繼承。

[ 
    { 
     attribute1, 
     attribute2, 
     ... 
    }, 
    ... 
] 

而一個treestore在節點的樹結構的格式保存數據,如下所示::

{ 
    attribute1, 
    attribute2, 
    ..., 
    children: [ 
     { 
      attribute1, 
      attribute2, 
      ..., 
      children: [ 
       ... 
      ] 
     } 
    ] 
} 

由於

甲存儲在模型數組的格式保存數據對於普通商店和樹木商店的這些完全不同的結構,它們的功能是完全不同的。我猜,在你上面的例子,正確的使用存儲和節點的功能是:

var data1 = treestore.getRootNode().getChildAt(0).get(fieldname); 

getRootNode()獲取其由具有檢索方法getChildAt(index)NodeInterface代表你的樹的根節點根節點的第一個子節點。然後我使用get(dataIndex)函數從節點獲取所需的屬性。