先上代码:
reloadNavNode : function() {
var tree=nodeSelected.getOwnerTree();
         tree.root.reload();
         tree.expandPath(nodeSelected.getPath());
}火狐调试,报错如下:
this.getOwnerTree() is null问题来了:
如果没有tree.root.reload()能打开;加了之后为什么nodeSelected.getPath())就找不着路径报错了??
其实就想异步更新节点之后,对整个树进行一次重新刷新加载,最后再打开选中到刚刚修改的节点,
这么一个通俗的需求我想一定有高手想出办法搞定的,还望能不吝赐教,不然晚饭都吃不香了,拜谢!问题解决立马送分,在线苦苦苦苦苦苦苦苦等....................

解决方案 »

  1.   


    // 全局路径
    if(typeof(glbRootPath) != "undefined"){
    basePath = glbRootPath;
    }
    function exxxx(tree,id){
    tree.getNodeById(id).expandChildNodes(true);//2  是被刷新的结点编号 
    }
    // 导航树
    NavTree = function(){
    var nav;//EXT 树面板
    var navEditor;//EXT树编辑 面板
    var rootMenu;//根菜单
    var dirMenu;//目录菜单
    var loader;//json源数据
    var root;//根
    var removeFlag = false;//是否可以删除
    var titleChangeFlag = false;//标题是否可被修改
    var nodeSelected;//当前被选中的节点
    var mgr;//dwr函数
    return {
    //更新当前叶子节点所属父节点数据
    reloadNavNode : function() {
          var tree=nodeSelected.getOwnerTree();
                          tree.root.reload();
                          tree.expandPath(nodeSelected.getPath());

    },
    init : function(){
    //检测dwr函数是否装配到位
    if(!mgr){
    Ext.Msg.alert("警告提示","请先通过NavTree.setMgr()设置mgr");
    return;
    }
    //初始化json数据源
    if(!loader){
    loader = new Ext.tree.TreeLoader({
    url :  showpath
    });
    loader.on('beforeload', function(treeloader, node) {
    treeloader.baseParams = {
    id : node.id,
    method : 'tree'
    };
    }, this);
    }
    //初始化根节点
    if(!root){
    root = new Ext.tree.AsyncTreeNode({
    id : '0',
    icon:basePath+'/images/globe.gif',
    text : "组织菜单"
    });
    }
    //初始化树面板
    if(!nav){
    nav = new Ext.tree.TreePanel({

    rootVisible : true,          //false为隐藏根节点 
    width : 240,
    height : 600,
    autoScroll : true,           //下拉框自动延伸
    containerScroll: true,       //拖拽节点时随光标自动延伸
    animate : true,              //以动画形式伸展
    loader : loader,             //json数据源
    root : root,                 //根节点
    enableDD : true,//可拖拽节点
    listeners : {
    'click' : function(node, event) {
    nodeSelected=node;
    if(node.id!=0){
    // var number = node.indexOf(node.lastChild)+1;
    window.open(nodepath+"?zzId="+node.id,"mainZzFrame");
    }

    }
    }
    });
    //事件: 添加右键菜单
    nav.on("contextmenu", this.showTreeMenu);
    //事件: 在拖动的时候,主要通过发送ajax请求,到后台,进行数据的同步修改   
    nav.on("textchange", function(node, newText, oldText) {
    if (!titleChangeFlag && newText != oldText) {
    mgr.ajaxUpdateTitle(node.id, newText, function(success) {
    if (!success) {
    Ext.Msg.show({
    title : "操作失败!",
    msg : "菜单修改失败!",
    buttons : Ext.Msg.OK,
    icon : Ext.MessageBox.ERROR
    });
    titleChangeFlag = true;
    node.setText(oldText);
    titleChangeFlag = false;
    }
    });
    }
    });
    //当树节点成为拖动目标时触发
    nav.on("nodedragover", function(e){ 
    var node = e.target; 
    if(node.leaf) 
    node.leaf=false; 
    return true; 
    });  //事件: 当节点移动前触发
    nav.on("beforemovenode", function(tree, node, oldParent, newParent, index) {
    if (confirm("确定要移动到当前位置吗?")) {
    mgr.ajaxMoveNode(node.id, oldParent.id, newParent.id, index);
    }else{
    return false;
    }
    });
    //事件: 当节点删除时触发
    nav.on("remove", function(tree, parentNode, node) {
    if (removeFlag) {
    mgr.ajaxRemoveNode(node.id);
    window.open(basePath+"/jsp/aqadmin/zzempty.jsp","mainZzFrame") 
    }
    });
    }
    this.setDirMenu();// 设置目录菜单
    this.setRootMenu();//设置根菜单
    },

    //dwr函数填充
    setMgr : function(manager){
    mgr = manager;
    },
    getMgr : function(){
    return mgr;
    }, // 设置子节点菜单
    setDirMenu: function(){
    if(!dirMenu){
    dirMenu = new Ext.menu.Menu({
    items : [{
    text : "修改标题",
    handler : function() {
    navEditor = new Ext.tree.TreeEditor(nav, {
    allowBlank : false,
    ignoreNoChange : true,
    completeOnEnter : true,
    blankText : '标题不能为空',
    selectOnFocus : true
    });
    navEditor.triggerEdit(nodeSelected);
    }
    }, "-", {
    text : "编辑",
    handler : function() {
    window.open(nodepath+"?zzId="+nodeSelected.id,"mainZzFrame") 
    }
    }, "-", {
    text : "添加组织机构",
    handler : function() {
    // var number = nodeSelected.indexOf(nodeSelected.lastChild)+1;
    var addpage = addnodepath+ "?zzglForm.id="+ nodeSelected.id 
    + "&zzglForm.leaf=1&zzglForm.node=1";
    window.open(addpage,"mainZzFrame") 
    }
    }, "-", {
    text : "删除",
    handler : this.delTreeItemComfirm
    }]
    });
    }
    },

    // 设置根目录菜单
    setRootMenu: function(){
    if(!rootMenu){
    if(fzzid=='0000000001'){//只有admin用户才有添加根组织权限
    rootMenu = new Ext.menu.Menu({
    items : [{
    text : "添加根组织",
    handler : function() {
    var number = nodeSelected.indexOf(nodeSelected.lastChild) + 1;
    var addpage =addnodepath+ "?zzglForm.id="+ nodeSelected.id 
    + "&zzglForm.leaf=1&zzglForm.node=0&zzglForm.ordnumber=" + number;
    window.open(addpage,"mainZzFrame") 
    }
    }, "-", {
    text : "打开所有节点",
    handler: function(){
    nav.expandAll()
    }
    }, "-", {
    text : "关闭所有节点",
    handler: function(){
    nav.collapseAll()
    }
    }]
    });
    }else{
    rootMenu = new Ext.menu.Menu({
    items : [{
    text : "打开所有节点",
    handler: function(){
    nav.expandAll()
    }
    }, "-", {
    text : "关闭所有节点",
    handler: function(){
    nav.collapseAll()
    }
    }]
    });
    }

    }
    },

    //显示右键菜单
    showTreeMenu : function(node, e){
    nodeSelected = node;
    nodeSelected.select();
    if (node.id==0) {// 如果是根节点
    rootMenu.showAt(e.getPoint());
    } else {// 如果不是
    dirMenu.showAt(e.getPoint());
    }
    },

    //删除操作前提示
    delTreeItemComfirm : function(){
    dirMenu.hide(true);
    if(nodeSelected.text=='公共组织'){
    alert('公共组织不可删除');
    return false;
    }
    var message='确实要删除此节点吗?';
    DWREngine.setAsync(false);//设置DWR同步调用
    //校验是否存在子组织
    mgr.hasChildZz(nodeSelected.id, function(flag) {
    if(flag){
    message='请注意,此组织有下级子组织 \n 如果确实要删除,那么子组织也将会被删除!';
    }
    });
    if(confirm(message)){
    //校验该节点下是否有人
    mgr.hasChildRen(nodeSelected.id, function(flag) {
     if(flag){
    alert('删除失败,请先删除完此组织里的人员之后才能删除!');
    }else{
    removeFlag = true;
    nodeSelected.remove();
    removeFlag = false;
    }
    });
    }
    },

    show : function(){
    nav.render(Ext.getBody());
    nav.getRootNode().toggle();
    }
    }
    }();// 文档加载完毕执行
    Ext.onReady(function(){
    Ext.BLANK_IMAGE_URL = basePath+"/js/ext/images/default/s.gif";
    if(typeof(NavigateManager)=="undefined"){
    Ext.Msg.alert("警告提示","请先设置DWR,并实例化NavigateManager");
    }else{
    NavTree.setMgr(NavigateManager);
    NavTree.init();
    NavTree.show();
    }
    });
      

  2.   

    reloadNavNode : function() { 
    var tree=Ext.getCmp("zuzhitree");
    var node= tree.getNodeById(nodeSelected.id)
    node.parentNode.reload();
    }非常感谢zoujp_xyz的热心回帖,问题已经解决了,原因是EXT刷新操作是先把节点全部删除掉,最后再重新ajax请求塞进窗口里,导致上次各个节点打开的状态都无法保存,也就是说,刷新后再想回到当初选中的状态直接以前那种操作是不可能取到值的通过ext函数Ext.getCmp("zuzhitree")方法,类似于java反射的原理,等树加载完毕之后,根据上一次选中的节点id值去反射查找到节点,这样每次刷新,状态依旧,这就是ext真正的强大和魅力!!!!
      

  3.   

    这就ext的局部刷新操作,不管刷新几次窗口永远打开在自身修改的选中节点上,连tree.expandPath(nodeSelected.getPath());都不用写了,tree.expandPath(nodeSelected.getPath());这个操作是完全对静态树来说的,也就说你的树没加载完毕,就打不开,延时我没试过,大概意思可能是等树加载完再去打开,延迟个十来秒,但是不完美!
      

  4.   

    Ext.getCmp("zuzhitree")这个zuzhitree是什么东西?
      

  5.   

    楼主 你好  wo QQ497234690  加你好友好吗
      

  6.   


    那请问我的TreeStore分别加载两次,第一次load10条,第二次load5条,为什么Treepanel上的数据一直都是10条,只要当我刷新了浏览器才会将那5条显示出来呢