`
lxwt909
  • 浏览: 573516 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ExtJS5学习之TreePanel(续)

阅读更多

    承接着上一篇,在TreePanel的节点上应用CellEditor插件对节点进行修改,上一篇《ExtJS5学习之TreePanel》中节点数据修改是通过弹出一个Window实现的,这次我们来试试使用CellEditor插件来完成同样的功能,关键代码如下:

      

/*****************ExtJS TreePanel面板*********************/
Ext.define("OA.view.TreePanel",{
    extend:'Ext.tree.Panel',
    alias : 'widget.mytreepanel',
    alternateClassName: ["OA.TreePanel"],
    initComponent : function(){
        Ext.apply(this,{
            title:"导航菜单",
            animate:true,
            animCollapse: true,
            autoScroll : true,
            scroll: "vertical",
            rootVisible : false,
            lines: false,
            useArrows: true,
            containerScroll: true,
            collapsed: false,
            collapsible: false,
            layout: "fit",
            border: false,
            width: 200,
            dockedItems: {
                dock : 'top',
                xtype : 'toolbar',
                items : [
                    {
                        xtype : 'button',
                        text : '刷新'
                    },
                    {
                        xtype : 'button',
                        text : '展开'
                    },
                    {
                        xtype : 'button',
                        text : '收缩'
                    }
                ]
            },
            viewConfig : {
                loadingText : "正在加载...",
                plugins: {
                    ptype: 'treeviewdragdrop'
                },
                listeners: {
                    drop: function(node, data, dropRec, dropPosition) {
                        //store.sync();
                    }
                }
            },
            store: Ext.create("OA.store.TreeStore")
        });
        this.plugins = [{"ptype": "cellediting"}];
        this.columns = [
            {
                xtype: 'treecolumn',
                dataIndex: 'text',
                flex: 1,
                editor: {
                    xtype: 'textfield',
                    selectOnFocus: true,
                    validator: function(value){
                        value = Ext.String.trim(value);
                        return value.length < 1 ? this.blankText : true;
                    }
                }
            },
            {
                xtype: 'actioncolumn',
                width: 24,
                icon: 'delete.png',
                iconCls: 'x-hidden',
                tooltip: 'Delete'
            }
        ];
        this.callParent(arguments);
    }
});

 关键点1在:

this.plugins = [{"ptype": "cellediting"}];

 这里表示添加celleditor插件,添加了该插件之后,双击树节点可以对节点名称进行修改,默认该插件是双击进入编辑模式,当然你也可以通过修改clickToEdit值来改变这种默认行为,比如

this.plugins = [{"ptype": "cellediting","clickToEdit":1}];

 "clickToEdit":1即表示点击节点一次就可进入编辑模式,默认该值为2.

 

关键点2在:

 

this.columns = [
            {
                xtype: 'treecolumn',
                dataIndex: 'text',
                flex:4,
                width: 100,
                editor: {
                    xtype: 'textfield',
                    selectOnFocus: true,
                    allowBlank: false,
                    allowOnlyWhitespace: false
                }
            },
            {
                xtype: 'actioncolumn',
                itemId: "deleteCol",
                flex:1,
                icon: 'delete.png',
                tooltip: 'Delete',
                iconCls: 'x-hidden'
            }
        ];

 这里定义了两列,一列用于显示节点数据,一列用于显示操作按钮或者说操作图标即xtype:"actioncolumn"。flex:1这里的flex表示定义这两列的宽度比例,如果一个flex:4,一个flex:1即表示这两列的显示宽度比例是4:1,你懂的。icon是显示图标资源文件的路径,tooltip是鼠标放在图标上时弹出的文字提示,iconCls是当前图标应用的CSS类样式,x-hidden是我自定义的css类样式,定义在index.jsp里

 

 

<style type="text/css">
        .x-hidden {
            visibility: hidden !important
        }
    </style>

 visibility: hidden !important表示隐藏不显示

 

剩下的就是监听事件做相应的逻辑处理,事件监听写在Controller里,代码如下:

 

/*******************全局应用程序控制器类******************/

//首先载入工具类
Ext.require(
    [
        'OA.util.CommonDoActionUtil'
    ]
);

Ext.define('OA.controller.AppController', {
    extend: 'Ext.app.Controller',
    requires: ['OA.util.CommonDoActionUtil'],
    //数据模型注册
    models: [
        'TreeModel'
    ],
    //视图注册
    views: ["TreePanel","TreeContextMenu","TreeEditWindow"],
    //数据源注册
    stores: [
        'TreeStore'
    ],
    init: function() {
        var id_ = 111;
        var currentRecord = null;
        this.control({
            "mytreepanel": {
                itemcontextmenu: function(_this, record, item, index, evt, eOpts) {
                    if(!this.ctxMenu) {
                        this.ctxMenu = Ext.create("OA.view.TreeContextMenu");
                    }
                    this.ctxMenu.showAt(evt.getXY());
                    //缓存当前鼠标右键选中的节点数据Name
                    currentRecord = record;
                    evt.preventDefault();
                    //evt.stopEvent();
                    _this.getSelectionModel().select(index);
                },
                //鼠标进入时显示ActionColumn
                itemmouseenter: function(view, list, node, rowIndex, e) {
                    var icons = Ext.DomQuery.select('.x-action-col-icon', node);
                    if(view.getRecord(node).get('id') != 0) {
                        Ext.each(icons, function(icon){
                            Ext.get(icon).removeCls('x-hidden');
                        });
                    }
                },
                //鼠标离开时隐藏ActionColumn
                itemmouseleave: function(view, list, node, rowIndex, e) {
                    var icons = Ext.DomQuery.select('.x-action-col-icon', node);
                    Ext.each(icons, function(icon){
                        Ext.get(icon).addCls('x-hidden');
                    });
                },
                containerclick: function(_this,e,eOpts) {
                    if(this.ctxMenu) {
                        this.ctxMenu.hide();
                    }
                },
                //编辑完成后触发
                edit: function(editor,e) {
                    e.record.commit();
                    console.log(e.record.get("text"));
                }
            },
            "treecontextmenu > menuitem[itemId=add]": {
                click: function(item, event, eOpts) {
                    if(currentRecord) {
                        currentRecord.appendChild(
                            {
                                id: id_++,
                                "text": "测试节点_" + id_,
                                "leaf": true
                            }
                        );
                        //展开当前节点
                        currentRecord.expand();
                        //发送ajax请求到后台插入添加的节点数据,你懂的
                    }
                }
            },
            "treecontextmenu > menuitem[itemId=edit]": {
                click: function(item, event, eOpts) {
                    if(currentRecord) {
                        if(!this.editWin) {
                            this.editWin = Ext.create("OA.view.TreeEditWindow");
                        }
                        this.editWin.show();
                    }
                }
            },
            "treecontextmenu > menuitem[itemId=delete]": {
                click: function(item, event, eOpts) {
                    if(currentRecord) {
                        currentRecord.parentNode.removeChild(currentRecord);
                        currentRecord.commit();
                    }
                }
            },
            "treeeditwindow button[itemId=ok]": {
                click: function(_this, e, eOpts ) {
                    if(currentRecord) {
                        //获取表单数据
                        var formData = _this.up("treeeditwindow").down("form").getForm().getValues();
                        var nodeText = formData.nodeName;
                        //修改节点数据
                        currentRecord.set("text",nodeText);
                        currentRecord.commit();
                        //同理,发送Ajax请求到后台修改节点数据
                    }
                    //关闭窗体
                    _this.up("treeeditwindow").hide();
                }
            },
            "treeeditwindow button[itemId=cancle]": {
                click: function(_this, e, eOpts ) {
                    _this.up("treeeditwindow").hide();
                }
            },
            //点击删除小图标时删除当前树节点
            "actioncolumn[itemId=deleteCol]": {
                click: function(gridView, rowIndex, colIndex, column, e, record) {
                    //获取当前删除小图标所处行的树节点的数据
                    var model = gridView.getRecord(gridView.findTargetByEvent(e));
                    console.log(model.parentNode);
                    model.parentNode.removeChild(model);
                    model.commit();
                    //这里是演示下在当前事件里如何获取当前TreePanel对象
                    console.log(gridView.up("mytreepanel"));
                    //gridView.up("mytreepanel").deleteNode(model);
                }
            }
        });
        this.commonAction = Ext.create('OA.util.CommonDoActionUtil');
    }
});

 在上一篇的基础上多监听了几个事件,比较重要的就是如何编写组件查询表达式,;类似于JQuery的选择器表达式,懂JQuery的话,应该会举一反三。下面对一些重点进行说明:

 

 

//编辑完成后触发
                edit: function(editor,e) {
                    e.record.commit();
                    console.log(e.record.get("text"));
                }

 这里是监听cellEditor插件在退出编辑模式完成编辑时触发的动作,首先通过e.record获取到你修改后新的节点名称数据,e.record是一个Ext.data.Model类的对象,你可以通过e.record.get("属性名")来获取相应属性值,有了修改后的数据,剩下就是把数据通过ajax方式发送到后台更新到数据库,demo里并没有提供跟后台交互的示例代码,留给你们自己去完成。

 

//点击删除小图标时删除当前树节点
            "actioncolumn[itemId=deleteCol]": {
                click: function(gridView, rowIndex, colIndex, column, e, record) {
                    //获取当前删除小图标所处行的树节点的数据
                    var model = gridView.getRecord(gridView.findTargetByEvent(e));
                    console.log(model.parentNode);
                    model.parentNode.removeChild(model);
                    model.commit();
                    //这里是演示下在当前事件里如何获取当前TreePanel对象
                    console.log(gridView.up("mytreepanel"));
                    //gridView.up("mytreepanel").deleteNode(model);
                }
            }

 这里是监听删除小图标的单击事件,点击后删除当前树节点,代码逻辑里面有详细注释,就不再啰嗦了。同理,这里也并没有与后台交互的代码,实际可能需要在这里发送Ajax请求到后台去删除该节点数据的,你懂的哈!

 

 

//鼠标进入时显示ActionColumn
                itemmouseenter: function(view, list, node, rowIndex, e) {
                    var icons = Ext.DomQuery.select('.x-action-col-icon', node);
                    if(view.getRecord(node).get('id') != 0) {
                        Ext.each(icons, function(icon){
                            Ext.get(icon).removeCls('x-hidden');
                        });
                    }
                },
                //鼠标离开时隐藏ActionColumn
                itemmouseleave: function(view, list, node, rowIndex, e) {
                    var icons = Ext.DomQuery.select('.x-action-col-icon', node);
                    Ext.each(icons, function(icon){
                        Ext.get(icon).addCls('x-hidden');
                    });
                },

 

这两处是实现鼠标悬浮进入时显示删除小图标,鼠标离开时隐藏删除小图标,这个仅仅是玩了一个JS效果,没什么实际用途,可加可不加。

 

最后照例弄几张效果图,不然光代码不够形象,



 

 

 如果你仍有什么疑问或者你需要demo源代码,请加我QQ:7-3-6-0-3-1-3-0-5,或者加裙一起交流学习:


 

 

 

  • 大小: 46.4 KB
  • 大小: 44.5 KB
  • 大小: 146.5 KB
  • 大小: 6 KB
分享到:
评论

相关推荐

    Extjs入门教程(treePanel和GridPanel)

    在学习过程中,理解ExtJS的MVC(Model-View-Controller)架构至关重要,因为TreePanel和GridPanel都是View部分,它们的数据源(Model)和控制器(Controller)是实现功能的关键。同时,熟悉JSON格式数据的处理也是...

    Extjs开发之对于TreePanel的MultiSelectionModel重置不起作用

    在EXTJS开发中,TreePanel是用于展示层级结构数据的组件,它经常被用来构建文件系统或者组织结构等。在处理TreePanel时,我们可能会遇到一个常见问题:当尝试使用MultiSelectionModel(多选模型)重置选中的节点时,...

    Extjs4 treePanel节点刷新JS函数

    完美的Extjs4 treePanel节点刷新,函数为自动刷新选中的节点.API看得头疼才别出来的代码.截止我发之前,好像没有谁共享这个功能的函数吧.

    ExtJS4 treepanel与girdpanel简单案例(包括MVC模式与非MVC模式)

    用ExtJS4实现的treepanel与gridpanel的简单互动案例 包含mvc开发模式与普通开发模式两种 普通开发模式:需要在引入js文件夹中的main.js文件 mvc开发模式:需要引入app文件夹中的app.js文件 适合初学extjs4的朋友

    extjs4 MVC2 TreePanel动态JSON实现

    根据提供的文件信息,我们可以深入探讨如何在ExtJS4框架中使用MVC2模式下的TreePanel组件结合动态JSON数据实现树形结构的展示与交互。以下将详细解释代码中涉及的关键概念和技术要点: ### 1. 创建TreeStore实例 ...

    Extjs做的treepanel+tab切换页

    在"Extjs 做的treepanel+tab切换页"这个项目中,我们主要关注的是如何利用ExtJS 3.2版本来创建一个具备折叠面板(Collapsible Panel)功能的树形视图(TreePanel),以及与之联动的选项卡(TabPanel)。这个设计允许...

    ExtJS 3.4关于TreePanel的一些实例

    学习TreePanel时根据网上的资料自己实现的实例,结构如下: 1. 创建一棵树 2. 使用TreeLoader加载数据生成树 3. 读取本地Json数据生成树 4. 使用Servlet提供数据 5. 树的事件 6. 右键菜单 7. 修改节点的默认图标 8. ...

    获取Extjs中的TreePanel中所有的被checked的叶子节点的id

    在本篇文章中,我们将深入探讨如何在ExtJS框架中获取TreePanel中所有被选中(checked)的叶子节点的ID。此技术对于处理复杂的数据结构、优化用户交互体验以及实现高效的数据管理至关重要。 ### 一、ExtJS简介 ...

    extjs中Ext.Panel和TreePanel 组件动态加载本地页面数据

    在EXTJS这个强大的JavaScript框架中,`Ext.Panel`和`TreePanel`是两个非常重要的组件,它们被广泛用于构建复杂的用户界面。这篇文章将探讨如何在这些组件中动态加载本地页面数据,以提升用户体验并实现灵活的数据...

    ExtJS_TreePanel_树的配置详细属性

    主要方法: collapseAll():收缩所有树节点 expandAll():展开所有树节点 getRootNode():获取根节点 getNodeById(String id):获取指定id的节点 expand( [Boolean deep], [Boolean anim],

    extjs4 treepanel动态改变行高度示例

    在本文中,我们将探讨ExtJS 4框架中的TreePanel组件如何动态地改变行高。TreePanel是ExtJS中用于展示树形结构数据的组件,它通常用于显示文件系统结构、组织架构等层次化数据。动态改变行高是提高用户界面友好性和...

    无废话ExtJs 系列教程十五[树:TreePanel]

    《无废话ExtJs系列教程十五:树:TreePanel》 ExtJs是一个强大的JavaScript库,用于构建富客户端Web应用。在本教程中,我们将深入探讨一个重要的组件——TreePanel,它是ExtJs用来展示层次结构数据的工具,常用于...

    extjs TreePanel

    EXTJS中的TreePanel是用于展示层级数据的组件,它以树状结构呈现数据。TreePanel提供了丰富的配置项和方法,使得我们可以灵活地控制树的显示和交互。以下是对TreePanel及其主要配置项和方法的详细说明: 1. **主要...

    EXTJS实例 EXTJS树,可以编辑的EXTJS,EXTJS3.0

    5. **启用编辑**:EXTJS提供了`TreeEditor`类,用于启用树节点的编辑功能。我们需要配置编辑器,指定要编辑的字段及编辑器类型(如TextField、ComboBox等)。 6. **监听事件**:为TreePanel和TreeEditor添加事件...

    extjs4中panel的accordion布局以及treepanel导航

    在EXTJS4中,Panel和TreePanel是两个非常重要的组件,它们在构建用户界面时扮演着核心角色。本文将深入探讨Panel的accordion布局以及TreePanel的动态导航功能,帮助开发者更好地理解和运用这些特性。 首先,让我们...

    通过CSS样式来修改ExtJS:TreePanel的小图标

    在ExtJS框架中,TreePanel是一种用于展示层次结构数据的组件,它以树形结构的形式显示数据。在设计用户界面时,我们可能需要自定义TreePanel中的节点图标以增强视觉效果或传达特定的信息。本篇将详细介绍如何通过CSS...

    ExtJS4中文教程2 开发笔记 chm

    Extjs4 TreePanel实例 ExtJs4 动态加载 Extjs4 带复选框的树(Checkbox tree) Extjs4 新的布局方式 Extjs4 锁定表头(Locking Grid)功能 Extjs4.0 MVC实例 Extjs4.0动态填充combobox数据 Extjs4中up()和down()的用法...

    JavaScript的ExtJS框架中数面板TreePanel的用法实例解析_.docx

    在JavaScript的ExtJS框架中,TreePanel是一种强大的组件,它用于展示树形结构的数据,尤其适合处理JSON格式的信息。TreePanel允许用户以交互的方式浏览层级化的数据,这在很多应用场景中,如文件系统、组织结构或者...

    extJs3升级extjs4方案

    ExtJS3 升级到 ExtJS4 方案 ExtJS3 升级到 ExtJS4 需要修改大量代码,主要是因为 ExtJS4 配备了一类新的系统,不向后兼容...ExtJS3 升级到 ExtJS4 需要修改大量代码,需要我们重新学习和适应 ExtJS4 的新特性和变化。

Global site tag (gtag.js) - Google Analytics