0

我发现了如何刷新树并且一切正常。但现在我想专注于一个特定的节点,它总是说 _itemNodesMap 是未定义的。

这是我所拥有的:

    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 是未定义的。为什么?显示树,设置路径,除此之外的一切都有效。能得到一些帮助会很棒。谢谢!

4

2 回答 2

0

如果您的错误是 _itemNodesMap 未定义,则它不是 _itemNodesMap 的问题,而是您的“this”不是您在调用滚动函数时所认为的那样(可能通过一个事件,这很可能使用“this”的全局对象)。

您应该尝试使用“dojo/_base/lang”和 lang.hitch 函数来确保您的“this”始终是原始对象。

require([
    ...
    "dojo/_base/lang"
], function(..., lang){
...
    scroll: lang.hitch(this, function(path){
        var itemnode = this._itemNodesMap[path[path.length-1]];
        this.focusNode(itemnode[0]);
    })
....
});
于 2013-07-12T01:51:16.030 回答
0

我相信设置路径是一个延迟过程,因此假设path您的scroll函数中的变量已考虑到这一点,我将使用以下内容来关注您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);
}
于 2013-07-11T12:25:49.880 回答