2013-07-11 51 views
0

我發現如何刷新一棵樹,一切正常。但是現在我想關注一個特定的節點,它總是說_itemNodesMap是未定義的。dijit.Tree refresh and focusNode

以下是我有:

require([ 
    "dojo/_base/window", "dojo/data/ItemFileWriteStore", 
    "dijit/tree/ForestStoreModel", "dijit/Tree", 
    "dojo/domReady!" 
    ], function(win, Ifrs, ForestStoreModel, Tree){ 
    dojo.extend(Tree, { 

     reload: function (data, path) {    
    this.dndController.selectNone(); 
this.model.store.clearOnClose = true; 
this.model.store.close(); 
this._itemNodesMap = {}; 
this.rootNode.state = "UNCHECKED"; 
this.model.root.children = null; 
this.rootNode.destroyRecursive(); 

    var _data = {identifier: "id", label: "label", items: data}; 
var _store = new Ifrs({data:_data}); 
var _treeModel = new ForestStoreModel({ 
     store: _store, 
      rootId:"root", 
      rootLabel:"Things", 
      childrenAttr:["children"] 
    }); 
    this.model.constructor(_treeModel); 
    this.postMixInProperties(); 
    this._load(); 
    path.unshift("root"); 
    this.set('path',path); 
    }}); 

用於聚焦我嘗試添加以下內容並設置路徑後調用它:

scroll : function(path){ 
    var itemnode = this._itemNodesMap[path[path.length-1]]; 
    this.focusNode(itemnode[0]); 
    } 

但我總是拿到_itemNodesMap是不確定的。爲什麼?顯示樹,路徑設置,除此之外的所有內容都可以工作。會很好,得到一些幫助。謝謝!

回答

0

我認爲,設置路徑是一個延遲的過程,所以假設你scroll功能的path變量已經考慮到這點,我會用下面你then功能專注於你的樹項目(節點):

var item = myTree.path[path.length-1]; 
var nodes = myTree.getNodesByItem(item); 
if (nodes && nodes.length > 0 && nodes[0]) { 
    nodes[0].domNode.scrollIntoView(true); 
} 
+0

謝謝您的回答。我沒有使用任何延遲,只是用this.set('path',path)設置路徑; – Sezunna

+0

現在使用你的代碼會導致同樣的問題。 myTree.path(或者在我的情況下,它是this.path [path.lenght-1])未定義。即使之後視圖中的路徑設置正確。我應該嘗試使用延期嗎? (從來沒有這樣做過,所以我有點經驗不足) – Sezunna

+0

函數調用是:dijit.byId(「myTree」)。reload(data,path); dijit.byId( 「myTree」)滾動(路徑)。; – Sezunna

0

如果你的錯誤是_itemNodesMap是不確定的,它不是用_itemNodesMap有問題,而是你的「本」是不是你認爲它是在哪裏的滾動功能被稱爲點(可能通過一個事件,可能使用全局對象來處理'this')。

你應該嘗試使用「道場/ _base /郎」和lang.hitch功能,確保您的「這」永遠是原來的對象。

require([ 
    ... 
    "dojo/_base/lang" 
], function(..., lang){ 
... 
    scroll: lang.hitch(this, function(path){ 
     var itemnode = this._itemNodesMap[path[path.length-1]]; 
     this.focusNode(itemnode[0]); 
    }) 
.... 
}); 
+0

感謝您的回答,但在添加代碼後,這不再是Tree對象,而是窗口,它再次沒有_itemNodesMap。 – Sezunna