• Ext Tree异步树的增加修改删除的简单实现~


    之前项目有个模块要求用树形解决,附带要实现checkbox,增删修改以及copy/cut/paste等等功能;
    因为之前写的人用了xloadTree,其他功能都实现了,但是客户要求要有cookie功能,实现不了麻烦啊~

    正巧现在在学习用Ext,发现Ext的tree本身就很强大基本的功能都可以实现。
    Ext.onReady(function() {
        Ext.QuickTips.init();
        Ext.state.Manager.setProvider(
    new Ext.state.CookieProvider());

        
    var onConfirmDelete = function(btn) {
            
    if (btn == 'yes') {
                
    var treePanel = Ext.getCmp('treepanel');
                treePanel.el.mask('删除中', 'x
    -mask-loading');
                
    var selNode = treePanel.getSelectionModel().getSelectedNode();

                Ext.Ajax.request({
                            url : 'organ
    !del.do',
                            params : {
                                organId : selNode.id
                            },
                            success : 
    function(response, opts) {
                                treePanel.el.unmask();
                                
    var responseJson = Ext
                                        .decode(response.responseText);

                                
    if (responseJson.success === true) {
                                    selNode.remove();
                                } 
    else {
                                    Ext.Msg
                                            .alert('An error occured 
    with the server.');
                                }
                            }
                        });

            }

        }

        
    var onDelete = function() {
            
    var treePanel = Ext.getCmp('treepanel');
            
    var selNode = treePanel.getSelectionModel().getSelectedNode();

            
    if (selNode) {
                Ext.MessageBox.confirm('是否确定
    ?',
                        '请确定删除目录' 
    + selNode.attributes.text, onConfirmDelete)
            }
        }

        
    var onCompleteAdd = function(treeEditor, newValue, oldValue) {
            
    var treePanel = Ext.getCmp('treepanel');
            
    var selNode = treePanel.getSelectionModel().getSelectedNode();

            
    if (newValue.length > 0) {
                Ext.Ajax.request({
                            url : 'organ
    !save.do',
                            params : {
                                'organInfo.name' : newValue,
                                'organInfo.pid' : selNode.id
                            },
                            success : 
    function(response, opts) {
                                treePanel.el.unmask();
                                
    var responseJson = Ext
                                        .decode(response.responseText);

                                
    if (responseJson.success !== true) {
                                    Ext.Msg.alert('An error occured 
    with the server.');
                                    treeEditor.editNode.remove();
                                } 
    else {
                                    treeEditor.editNode.setId(responseJson.data[
    0].id);
                                }
                            }
                        });
            } 
    else {
                treeEditor.editNode.remove();
            }
        }

        
    var onAddNode = function() {
            
    var treePanel = Ext.getCmp('treepanel');
            
    var selNode = treePanel.getSelectionModel().getSelectedNode();

            
    if (!this.treeEditor) {
                
    this.treeEditor = new Ext.tree.TreeEditor(treePanel, {}, {
                            cancelOnEsc : 
    true,
                            completeOnEnter : 
    true,
                            selectOnFocus : 
    true,
                            allowBlank : 
    false,
                            listeners : {
                                complete : onCompleteAdd
                            }
                        });
            }
            selNode.leaf 
    = false;
            selNode.expand(
    falsetruefunction() {
                        
    var newNodeCfg = {
                            text : '',
                            id : 'tmpNode',
                            leaf : (selNode.id 
    != '0'),
                            checked : 
    true
                        }

                        
    var newNode = selNode.insertBefore(newNodeCfg,
                                selNode.firstChild);
                        
    this.treeEditor.editNode = newNode;
                        
    this.treeEditor.startEdit(newNode.ui.textNode);

                    }, 
    this);
        }

        
    var onCompleteEdit = function(treeEditor, newValue, oldValue) {
            
    var treePanel = Ext.getCmp('treepanel')
            treePanel.el.mask('保存中', 'x
    -mask-loading');
            
            
    var selNode = treePanel.getSelectionModel().getSelectedNode();

            
    var editNode = treeEditor.editNode;
            
    var editNodeId = editNode.id;
            Ext.Ajax.request({
                        url : 'organ
    !saveC.do',
                        params : {
                            'organInfo.id' : editNodeId,
                            'organInfo.name' : newValue,
                            'organInfo.pid' : editNode.parentNode.id
                        },
                        success : 
    function(response, opts) {
                            treePanel.el.unmask();
                            
    var responseJson = Ext.decode(response.responseText);
                            
    if (responseJson.success !== true) {
                                editNode.setText(oldValue);
                                Ext.Msg.alert('An error occured 
    with the server.');
                            }
                        },
                        failure : 
    function(response, opts) {
                            treePanel.el.unmask();
                            editNode.setText(oldValue);
                            Ext.Msg.alert('An error occured 
    with the server.');
                        }
                    });
        }

        
    var onEdit = function() {
            
    var treePanel = Ext.getCmp('treepanel');
            
    var selectedNode = treePanel.getSelectionModel().getSelectedNode();

            
    if (!this.treeEditor) {
                
    this.treeEditor = new Ext.tree.TreeEditor(treePanel, {}, {
                            cancelOnEsc : 
    true,
                            completeOnEnter : 
    true,
                            selectOnFocus : 
    true,
                            allowBlank : 
    false,
                            listeners : {
                                complete : onCompleteEdit
                            }
                        });
            }

            
    this.treeEditor.editNode = selectedNode;
            
    this.treeEditor.startEdit(selectedNode.ui.textNode);
        }

        
    var buildCtxMenu = function() {
            
    return new Ext.menu.Menu({
                        items : [{
                                    itemId : 'add',
                                    handler : onAddNode
                                }, {
                                    itemId : 'edit',
                                    handler : onEdit,
                                    scope : onEdit
                                }, {
                                    itemId : '
    delete',
                                    handler : onDelete
                                }]
                    });
        }

        
    var onCtxMenu = function(node, e) {
            node.select();
            e.stopEvent();

            
    if (!this.ctxMenu) {
                
    this.ctxMenu = buildCtxMenu();
            }

            
    var ctxMenu = this.ctxMenu;
            
    var addItem = ctxMenu.getComponent('add');
            
    var editItem = ctxMenu.getComponent('edit');
            
    var deleteItem = ctxMenu.getComponent('delete');

            addItem.setText('新建文件夹');
            editItem.setText('重命名');
            deleteItem.setText('删除');

            
    if (node.id == '0') {
                addItem.enable();
                deleteItem.disable();
                editItem.disable();
            } 
    else {
                addItem.enable();
                editItem.enable();
                deleteItem.enable();
            }

            ctxMenu.showAt(e.getXY());
        },    
        
    var tree = new Ext.tree.TreePanel({
                    id : 'treepanel',
                    autoScroll : 
    true,
                    animate : 
    false,
                    enableDD : 
    true,
                    useArrows : 
    true,
                    plugins : [
    new Ext.ux.state.TreePanel()],
                    loader : 
    new WithubTreeLoader({
                                dataUrl : 'organ
    !newTree.do'
                            }),
                    root : {
                        nodeType : 'async',
                        id : '
    0',
                        text : '组织结构',
                        leaf : 
    false,
                        expanded : 
    true
                    },
                    listeners : {
                        contextmenu : onCtxMenu,
                    }
                });

        
    new Ext.Window({
                    height : 
    300,
                    width : 
    300,
                    layout : 'fit',
                    border : 
    false,
                    title : 'Our first tree',
                    items : tree
                }).show();

    });


    对应的save,del,newTree方法
    public String save() throws Exception {
            
    if(organInfo.getPid().equals("0")){
                organInfo.setPid(
    null);
            }
            String id 
    = organInfoService.saveOrganInfo(organInfo);
            
    return json("[{id:"+id+"}]");
        }

    public String del() throws Exception {
            List list 
    = this.searchList(organId, new ArrayList());
            StringBuffer sb 
    = new StringBuffer();
            sb.append(organId);
            
    if (list.size() != 0) {
                
    for (int i = 0; i < list.size(); i++) {
                    sb.append(
    ",").append(list.get(i));
                }
            }
            organInfoService.delOrganInfo(sb.toString().split(
    ","));
            
    return json();
        }

    public String newTree() throws Exception {
            StringBuffer sb 
    = new StringBuffer();
            List
    <OrganInfo> list;
            
    if(node.equals("0")){
                list 
    = organInfoService.getOrganInfoListByNull();
            }
            
    else{
                list
    = organInfoService.getOrganInfoByPidList(node);
            }
            
    int i = 0;
            sb.append(
    "[");
            
    for(OrganInfo oi : list) {
                
    if (i != 0) {
                    sb.append(
    ",");
                }
                sb.append(
    "{text:'").append(oi.getName()).append("',id:'").append(oi.getId()).append("'");
                List
    <OrganInfo> listId = organInfoService.getOrganInfoByPidList(oi.getId());
                
    if(listId.size() != 0) {
                    sb.append(
    ",leaf:false");
                } 
    else {
                    sb.append(
    ",leaf:true");
                }
                sb.append(
    ",checked: true");
                sb.append(
    "}");
                i
    ++;
            }
            sb.append(
    "]");
            
    return json(sb.toString());
        }

    哦,对应tree的打开状态的cookie记录的控件
    // vim: ts=4:sw=4:nu:fdc=4:nospell
    /*
    global Ext */
    /**
     * @class Ext.ux.state.TreePanel
     *
     * Ext.tree.TreePanel State Plugin
     * <br><br>
     * Usage:
    <pre>
    var tree = new Ext.tree.TreePanel({
         root:{
             nodeType:'async'
            ,id:'root'
            ,text:'Root'
        }
        ,loader: {
             url:'get-tree.php'
        }
        <b>,plugins:[new Ext.ux.state.TreePanel()]</b>
    });
    </pre>
     *
     * @author    Ing. Jozef Sakáloš
     * @copyright (c) 2009, by Ing. Jozef Sakáloš
     * @date      <ul>
     * <li>5. April 2009<li>
     * </ul>
     * @version   1.0
     * @revision  $Id: Ext.ux.state.TreePanel.js 676 2009-04-07 13:03:20Z jozo $
     *
     * @license Ext.ux.state.TreePanel.js is licensed under the terms of
     * the Open Source LGPL 3.0 license.  Commercial use is permitted to the extent
     * that the code/component(s) do NOT become part of another Open Source or Commercially
     * licensed development library or toolkit without explicit permission.
     * 
     * <p>License details: <a href="http://www.gnu.org/licenses/lgpl.html"
     * target="_blank">http://www.gnu.org/licenses/lgpl.html</a></p>
     *
     * @forum     64714
     * @demo      http://examples.extjs.eu/?ex=treestate
     * @download  <ul>
     * <li><a href="http://examples.extjs.eu/Ext.ux.state.TreePanel.js.bz2">Ext.ux.state.TreePanel.js.bz2</a></li>
     * <li><a href="http://examples.extjs.eu/Ext.ux.state.TreePanel.js.gz">Ext.ux.state.TreePanel.js.gz</a></li>
     * <li><a href="http://examples.extjs.eu/Ext.ux.state.TreePanel.js.zip">Ext.ux.state.TreePanel.js.zip</a></li>
     * </ul>
     *
     * @donate
     * <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
     * <input type="hidden" name="cmd" value="_s-xclick">
     * <input type="hidden" name="hosted_button_id" value="3430419">
     * <input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-butcc-donate.gif" 
     * border="0" name="submit" alt="PayPal - The safer, easier way to pay online.">
     * <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
     * </form>
     
    */

    Ext.ns('Ext.ux.state');

    // dummy constructor
    Ext.ux.state.TreePanel = function() {};

    Ext.override(Ext.ux.state.TreePanel, {
        
    /**
         * Initializes the plugin
         * @param {Ext.tree.TreePanel} tree
         * @private
         
    */
        init:
    function(tree) {

            
    // install event handlers on TreePanel
            tree.on({
                
    // add path of expanded node to stateHash
                 beforeexpandnode:function(n) {
                    
    this.stateHash[n.id] = n.getPath();
                }

                
    // delete path and all subpaths of collapsed node from stateHash
                ,beforecollapsenode:function(n) {
                    
    delete this.stateHash[n.id];
                    
    var cPath = n.getPath();
                    
    for(var p in this.stateHash) {
                        
    if(this.stateHash.hasOwnProperty(p)) {
                            
    if(-1 !== this.stateHash[p].indexOf(cPath)) {
                                
    delete this.stateHash[p];
                            }
                        }
                    }
                }
            });

            
    // update state on node expand or collapse
            tree.stateEvents = tree.stateEvents || [];
            tree.stateEvents.push('expandnode', 'collapsenode');

            
    // add state related props to the tree
            Ext.apply(tree, {
                
    // keeps expanded nodes paths keyed by node.ids
                 stateHash:{}

                
    // apply state on tree initialization
                ,applyState:function(state) {
                    
    if(state) {
                        Ext.apply(
    this, state);

                        
    // it is too early to expand paths here
                        // so do it once on root load
                        this.root.on({
                            load:{single:
    true, scope:this, fn:function() {
                                
    for(var p in this.stateHash) {
                                    
    if(this.stateHash.hasOwnProperty(p)) {
                                        
    this.expandPath(this.stateHash[p]);
                                    }
                                }
                            }}
                        });
                    }
                } 
    // eo function applyState

                
    // returns stateHash for save by state manager
                ,getState:function() {
                    
    return {stateHash:this.stateHash};
                } 
    // eo function getState
            });
        } 
    // eo function init

    }); 
    // eo override

    // eof

    以上基本实现了树形的主要功能,右键,cookie记住打开的对象,新增新的子节点,直接修改节点名称,删除。
  • 相关阅读:
    自己写的jQuery放大镜插件效果(一)(采用一张大图和一张小图片的思路)
    javascript 节点操作拷贝节点cloneNode()
    javascript节点操作移出节点removeChild()
    写的一个封拆包代码
    C#_socket拆包_封包_模拟乱序包
    VS2010使用DX报错 VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
    C#_C++_SDK_WM_KEYDOWN人物卡顿延迟解决方法
    MYSQL游标的使用
    MYSQL异常和错误机制
    CRM中的一个函数,保存一下,别系统被ぅ崩坏就麻烦了.
  • 原文地址:https://www.cnblogs.com/hannover/p/1868391.html
Copyright © 2020-2023  润新知