2012-05-31 45 views
0

我有一个树面板,我编程扩展。ExtJs树面板。如何滚动到节点

当我展开一个节点,我想“跳”这个节点,我的意思是滚动到它。

如何滚动树面板特定节点?

UPDATE: 我用分机4.1

+0

您使用的是什么版本的ExtJs? – sha

+0

我使用ExtJS的4.1 – Charles

回答

1

在ExtJS的3.x中,你可以尝试调用焦点()在TreeNodeUI(myNode.ui.focus())

0

树是异步加载的每一个节点,你需要调用的所有节点已经被加载后,才进行对焦。你将需要做的是设置你的根节点上自动加载为false,那么在后面的代码使用手动加载根节点的第一次:

rootNode.expand(true, function(){ 
    myTreePanel.getView().focusRow(nodeyouwanttofocus); 
}); 

做这种方式让您使用扩展功能,使扩大完全递归并且还的第一个参数确保所有节点被加载之后是一个函数的第二个参数只执行,guarenteeing该视图是正确的高度与该节点在视觉上存在。

另一种选择,可以让更多的flexability是挂钩到扩展事件:

var myTreeStore = Ext.create("Ext.data.TreeStore", { 
    listeners: { 
     expand: function(theParentNode){ 
      theParentNode.eachChild(function(node){ 
       if(nodeIWantSelected == node) 
        myTreePanel.getView().focusRow(node); 
      } 
     } 
    } 
}); 

,您可以使用选择模型。选择钩在选择节点(我认为这可能集中节点也)。

我还没有尝试过由沙之前提出“selectPath”,这似乎是一个更容易使用,但你可以在focusRow功能回调挂钩,我认为这工作了。

0

您可以使用tree.getView().focusRow(),喜欢它:

tree.expandPath(
    '/root/1/2/3', 
    'id', 
    '/', 
    function() { 
     tree.getView().focusRow(tree.getStore().getNodeById('3')); 
    } 
}); 

但是,如果你的树使用animate: true和异步加载每个节点与路径中的任何节点尚未加载这个方法行不通的(树没有滚动到由于多个布局更新而选择的节点)。

至于解决方法,您可以:

  1. 设置animate: false的树;
  2. 添加“afterlayout”监听器,就像这样:

    tree.on('afterlayout', function() { 
        tree.getView().focusRow(tree.getSelectionModel().getSelection()[0]); 
    } 
    

    我想你可以在需要时添加此处理程序,并删除它时,一切都做。

相关问题