ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2

运行效果:

此文介绍了根据操作左侧菜单在右面板展示相应内容。

 

一、主页

先看一下跳转主页的方式:由在webapp根目录下的index.jsp跳转至demo的index.jsp

下面是demo的index.jsp的代码

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setHeader("Expires","0");

    request.setCharacterEncoding("UTF-8");    
    
    //String webRoot = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
<link href="../ExtJS4.2/resources/css/ext-all-neptune-rtl.css" rel="stylesheet">
<link href="../ExtJS4.2/css/icon.css" rel="stylesheet">
<script src="../ExtJS4.2/ext-all.js"></script>
<script src="../ExtJS4.2/locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript" src="js/localXHR.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</head>
<body>
     <div id="north-div" style="height: 73px; background-color: #101010;"><img alt="思考者日记网|束洋洋个人博客" src="image/shuyangyang_01.jpg"></div>
      <div id="south-div" align="center">Copyright by 束洋洋&copy; www.shuyangyang.com.cn</div>
      <div id="div2"></div>
</body>
</html>

看样看到此页面在引用文件的地方会加载2个自定义的js,在body处定义了页面所包含的两个dom元素。

先贴出笔者看不懂的localXHR.js

if (document.location.protocol == 'file:') {

    Ext.override(Ext.data.Connection, {
        parseStatus: function() {
            return {
                success: true,
                isException: false
            };
        }
    });

}

然后是index.js

Ext.Loader.setConfig({
    enabled : true
});

Ext.Loader.setPath({
    'Ext.ux' : '../ExtJS4.2/ux'//设置命名空间的路径
});

Ext.require(['Ext.ux.TabCloseMenu']);//动态加载

Ext.onReady(function() {
    var rightPanel = Ext.create('Ext.tab.Panel', {
                activeTab : 0,
                border : false,
                autoScroll : true,
                //iconCls:'Applicationviewlist',
                region : 'center',
                items : [{
                            title : '首页',
                            iconCls: 'House',
                            html: '<iframe frameborder="no" border=0 height="100%" width="100%" src="blank.jsp" scrolling="auto"></iframe>',
                        }],
                plugins: [Ext.create('Ext.ux.TabCloseMenu',{//选项卡关闭插件
                              closeTabText: '关闭当前',//The text for closing the current tab.
                              closeOthersTabsText: '关闭其他',//The text for closing all tabs except the current one.
                              closeAllTabsText: '关闭所有'//The text for closing all tabs.
                          })]
            });
    
    var tree = Ext.create("Ext.panel.Panel", {
        height : '70%',//设置高度
        region : 'north',
        layout : {
            // layout-specific configs go here
            type : 'accordion',
            titleCollapse : true,//允许通过点击标题栏的任意位置来展开/收缩子项Panel
            animate : true,// 动画切换效果
            activeOnTop : false
        // 折叠展开是否改变菜单顺序
        },
        layoutConfig : {
            animate : true
        },
        split : true
    });

    // 左边下部Panel
    var detailsPanel = {
        id : 'details-panel',
        iconCls : "User",
        collapsible : true, // 是否折叠
        title : '信息',
        region : 'center',
        bodyStyle : 'padding-bottom:15px;background:#eee;',
        autoScroll : true,
        html : '<p class="details-info">用户名:束洋洋<br />部&nbsp;&nbsp;&nbsp;门:管理部<br />登录IP:156.15.26.101</p>'
    };
    // 左边下部Panel结束
    
    var model = Ext.define("TreeModel", { // 定义树节点数据模型
        extend : "Ext.data.Model",
        fields : [{name : "id",type : "string"},
                {name : "text",type : "string"},
                {name : "iconCls",type : "string"},
                {name : "leaf",type : "boolean"},
                {name : 'url',type:"string"},
                {name : 'description',type:"string"}]
    });
    
    //组建树,返回Ext.tree.Panel
    var buildTree = function(json) {
        return Ext.create('Ext.tree.Panel', {
                    rootVisible : false,//false,隐藏根节点。
                    border : false,//隐藏此树面板的边框
                    lines:false,//false,树用的线置为disable。
                    autoScroll:true,//自动显示滚动条
                    useArrows:true,
                    store : Ext.create('Ext.data.TreeStore', {//(必须的) Store树的数据源. 一个TreePanel必须绑定一个Ext.data.TreeStore。
                                model : model,//定义当前store对象的Model数据模型
                                root : {//当前store的根节点。
                                    expanded : true,//展开根节点。(因为根节点被设置为隐藏,所以在此可以不用设置此属性)
                                    children : json.children//子节点数组。
                                }
                            }),
                            listeners : {//配置监听
                                'itemclick' : function(view, record, item, index, e) {//选项的单击事件。单击选项时触发。--Ext.view.View-event-itemclick
                                    var leaf = record.get('leaf');//获取当前选项的leaf——是否为叶子节点
                                    //var typeId = record.get("TYPE_ID");
                                    var text = record.get('text');//获取当前选项的文本
                                    var icon = record.get('iconCls');//获取当前选项的图标
                                    var url = record.get('url');//获取当前选项的地址
                                    if (leaf) { //判断点击的是否是叶子节点,如果是,创建一个Panel
                                        var panel = Ext.create('Ext.panel.Panel',{
                                            title : text,//标题
                                            closable : true,//该属性配置为true,这个窗体的'close'工具按钮便会展现出来并且允许用户通过点击这个按钮来关闭这个窗体,false则相反。
                                            iconCls : icon,//左侧图标
                                            html : '<iframe width="100%" height="100%" frameborder="0" src='+url+'></iframe>'//一个 HTML片段——这个Panel的内容
                                        });
                                        rightPanel.add(panel);//右面板(Ext.tab.Panel)添加此组件
                                        rightPanel.setActiveTab(panel);//使此组件处于活动状态
                                    }
                                    /*var id = record.get('id');
                                    var text = record.get('text');
                                    var leaf = record.get('leaf');
                                    if (leaf) {
                                        alert('id-' + id + ',text-' + text
                                                + ',leaf-' + leaf);
                                    }*/
                                },
                                scope : this//The scope (this reference) in which the handler is executed. Defaults to the browser window.
                            }
                });
    };

    // 整体架构容器
    Ext.create("Ext.container.Viewport", {
        layout : 'border',
        items : [ {
            region : 'north',//北方
            contentEl : 'north-div',//指定一个已存在的HTML元素, 或者一个已存在HTML元素的 id , 它们将被用作当前组件的内容.
            height : 73,
            bodyStyle : 'background-color:#BBCCEE;'
        }, {
            region : 'south',//南方
            contentEl : 'south-div',
            height : 20,
            bodyStyle : 'background-color:#BBCCEE;'
        }, {
            layout : 'border',
            title : '菜单',
            id : 'layout-browser',
            region : 'west',//西方
            border : false,
            split : true,
            margins : '2 0 5 5',
            width : 200,
            //minSize : 10,//无效设置
            //maxSize : 50,//无效设置
            autoScroll : false,
            collapsible : true, // 是否折叠
            //iconCls : "Application",
            items : [ tree, detailsPanel ]//包含树面板、个人简介面板。注:子组件的相对位置在子组件里设置,如在tree中设置了height属性,就指定了tree的相对高度。
        },
            rightPanel
        ],
        listeners : {//监听。这里用来添加树面板里的菜单
            afterrender : function() {//在组件渲染完成之后触发.Ext.AbstractComponent
                 Ext.getBody().mask('正在加载系统菜单....');//显示遮罩层
                 Ext.Ajax.request({//向服务端发送ajax请求
                     url:'../../menu/showMenu',//请求地址
                     success : function(response) {//成功响应的回调函数。response:包含了响应数据的XMLHttpRequest对象.
                         Ext.getBody().unmask();//隐藏先前应用的遮罩层.
                         var json = Ext.JSON.decode(response.responseText);//获取返回的文本并解析为json格式。Ext.JSON.decode(..):解码(解析)JSON字符串对象。
                         if(json.code == 'OK'){
                             Ext.each(json.data, function(el) {//迭代一个数组或是可迭代的值,在每个元素上调用给定的回调函数 
                                 var panel = Ext.create('Ext.panel.Panel', {//创建一个Panel
                                                 id : el.id,//定义id
                                                 title : el.text,//定义标题
                                                 iconCls:el.iconCls,//定义图标
                                                 leaf    :el.leaf,//定义leaf。Ext.data.NodeInterface-cfg-leaf:设置为true表明本节点没有子节点。 不会为本节点渲染展开图标或箭头。
                                                 layout : 'fit'//定义布局。fit:当容器只包含一个子元素时, 子元素自动填满容器
                                 });
                                 panel.add(buildTree(el));//当前Panel添加由此节点的子节点所创建的树面板
                                 tree.add(panel);//tree(1个Panel)添加当前Panel
                             });
                         }else{}
                     },failure : function(request) {
                            Ext.MessageBox.show({
                                        title : '操作提示',
                                        msg : "连接服务器失败",
                                        buttons : Ext.MessageBox.OK,
                                        icon : Ext.MessageBox.ERROR
                                    });
                        },
                     method : 'post'//请求的方式
                 });
            }
        }
    });
});

 

分析:

1.插件。当前页面使用了选项卡关闭插件(Ext.ux.TabCloseMenu),效果如下:

因此需要加载Ext.ux.TabCloseMenu类,如下:

Ext.Loader.setConfig({
    enabled : true
});

Ext.Loader.setPath({
    'Ext.ux' : '../ExtJS4.2/ux'//设置命名空间的路径
});

Ext.require(['Ext.ux.TabCloseMenu']);//动态加载

这里有个小疑惑:采用Ext.require的方式加载类,还是“动态加载”吗?因为从表面上看在加载index.js时就会加载Ext.ux.TabCloseMenu类。不管怎样,这里把它加载就好。

2.页面布局

2.1 整体布局:整体采用Ext.container.Viewport的布局方式,其内部子组件采用border的布局方式,如下片段代码:

// 整体架构容器
    Ext.create("Ext.container.Viewport", {
        layout : 'border',
        items : [ {
            region : 'north',//北方
            contentEl : 'north-div',//指定一个已存在的HTML元素, 或者一个已存在HTML元素的 id , 它们将被用作当前组件的内容.
            height : 73,
            bodyStyle : 'background-color:#BBCCEE;'
        }, {
            region : 'south',//南方
            contentEl : 'south-div',
            height : 20,
            bodyStyle : 'background-color:#BBCCEE;'
        }, {
            layout : 'border',
            title : '菜单',
            id : 'layout-browser',
            region : 'west',//西方
            border : false,
            split : true,
            margins : '2 0 5 5',
            width : 200,
            //minSize : 10,//无效设置
            //maxSize : 50,//无效设置
            autoScroll : false,
            collapsible : true, // 是否折叠
            //iconCls : "Application",
            items : [ tree, detailsPanel ]//包含树面板、个人简介面板。注:子组件的相对位置在子组件里设置,如在tree中设置了height属性,就指定了tree的相对高度。
        },
            rightPanel
        ],

当Ext.container.Viewport采用border的布局方式,那么子组件的方位(东、南、西、北/中心)由子组件的region属性指定。上面的rightPanel组件在上面虽看不出,但在其内部定义了region : 'center'——在中心显示。

2.2 树面板(TreePanel)布局

此文中的树面板布局相对其他组件的布局相对复杂,为了方便说明,下面将树面板中accordion的布局方式去掉:

var tree = Ext.create("Ext.panel.Panel", {
        height : '70%',//设置高度
        region : 'north',
        /*layout : {
            // layout-specific configs go here
            type : 'accordion',
            titleCollapse : true,//允许通过点击标题栏的任意位置来展开/收缩子项Panel
            animate : true,// 动画切换效果
            activeOnTop : false
        // 折叠展开是否改变菜单顺序
        },*/
        layoutConfig : {
            animate : true
        },
        split : true
    });

去掉以后的显示效果:

上图说明了树面板的结构。在创建树面板的过程中,首先根据菜单的一级菜单创建一个Panel,然后再添加由此一级菜单的子菜单所创建的TreePanel,最后由tree(一个Panel)再把这个Panel添加进去。相应的代码如下:

                             Ext.each(json.data, function(el) {
                                 var panel = Ext.create('Ext.panel.Panel', {//创建一个Panel
                                                 id : el.id,
                                                 title : el.text,
                                                 iconCls:el.iconCls,
                                                 leaf    :el.leaf,
                                                 layout : 'fit'
                                 });
                                 panel.add(buildTree(el));//当前Panel添加TreePanel
                                 tree.add(panel);//tree添加当前Panel
                             });
3.事件

在index.js涉及了2个事件:

一是在创建Ext.container.Viewport容器时所设置的‘afterrender’事件,这个事件用于向服务端发送请求以往tree面板中添加菜单;下面看一下代码 Ext.container.Viewport

        listeners : {//监听。这里用来添加树面板里的菜单
            afterrender : function() {//在组件渲染完成之后触发。--Ext.container.Viewport
                 Ext.getBody().mask('正在加载系统菜单....');
                 Ext.Ajax.request({
                     url:'../../menu/showMenu',
                     success : function(response) {//成功响应的回调函数。response:包含了响应数据的XMLHttpRequest对象.
                         Ext.getBody().unmask();//隐藏先前应用的遮罩层.
                         var json = Ext.JSON.decode(response.responseText);//获取返回的文本并解析为json格式。Ext.JSON.decode(..):解码(解析)JSON字符串对象。
                         if(json.code == 'OK'){
                             Ext.each(json.data, function(el) {//迭代一个数组或是可迭代的值,在每个元素上调用给定的回调函数
                                 var panel = Ext.create('Ext.panel.Panel', {
                                                 id : el.id,
                                                 title : el.text,
                                                 iconCls:el.iconCls,
                                                 leaf    :el.leaf,
                                                 layout : 'fit'
                                 });
                                 panel.add(buildTree(el));//当前Panel添加TreePanel
                                 tree.add(panel);//tree添加当前Panel
                             });
                         }else{}
                     },failure : function(request) {
                            Ext.MessageBox.show({
                                        title : '操作提示',
                                        msg : "连接服务器失败",
                                        buttons : Ext.MessageBox.OK,
                                        icon : Ext.MessageBox.ERROR
                                    });
                        },
                     method : 'post'//请求的方式
                 });
            }
        }

注:事件名可以加单引号'',也可以不加.

 

二是在创建树面板中中Ext.data.TreeStore的‘itemclick’事件——此事件是用来在点击左侧菜单时,向右边的面板(选项卡)添加一个选项卡面板,下面再看一下这里的代码

                            listeners : {//配置监听
                                'itemclick' : function(view, record, item, index, e) {//选项的单击事件。单击选项时触发。--Ext.tree.Panel
                                    var leaf = record.get('leaf');
                                    //var typeId = record.get("TYPE_ID");
                                    var text = record.get('text');
                                    var icon = record.get('iconCls');
                                    var url = record.get('url');//获取当前选项的地址
                                    if (leaf) { //判断点击的是否是叶子节点,如果是,创建一个Panel
                                        var panel = Ext.create('Ext.panel.Panel',{
                                            title : text,//标题
                                            closable : true,//该属性配置为true,这个窗体的'close'工具按钮便会展现出来并且允许用户通过点击这个按钮来关闭这个窗体,false则相反。
                                            iconCls : icon,//左侧图标
                                            html : '<iframe width="100%" height="100%" frameborder="0" src='+url+'></iframe>'//一个 HTML片段——这个Panel的内容
                                        });
                                        rightPanel.add(panel);//右面板(Ext.tab.Panel)添加此组件
                                        rightPanel.setActiveTab(panel);//使此组件处于活动状态
                                    }
                                },
                                scope : this//The scope (this reference) in which the handler is executed. Defaults to the browser window.
                            }

这个‘itemclick’事件来自于Ext.tree.Panel,从此事件可知,当点击左边的菜单时,首先会判定该菜单是否为叶子节点,如果是,则会创建一个Panel,这个Panel含有标题,图标,html等属性,然后右选项卡面板会将此面板添加进去并将其设置为可活动的。需注意的是,由于所添加的Panel里的html属性是一个iframe,所以在渲染时会把iframe里的src所在资源页面包含进来。

 

功能

一、用户管理

当点击菜单选项中的“用户管理”,那么在rightPanel(选项卡面板)会添加一个子选项卡,此子选项卡有一个html配置,它是一个iframe,其中的src为:/demo/UserMan/index.jsp——即此菜单的url值。这样“用户管理”这个子选项卡就会包含这个页面。下面看一下这个页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setHeader("Expires","0");

    request.setCharacterEncoding("UTF-8");    
    
    //String webRoot = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户管理</title>
<link href="../../ExtJS4.2/resources/css/ext-all-neptune-rtl.css" rel="stylesheet">
<link href="../../ExtJS4.2/css/icon.css" rel="stylesheet">
<script src="../../ExtJS4.2/ext-all.js"></script>
<script src="../../ExtJS4.2/locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript" src="../js/localXHR.js"></script>
<script type="text/javascript" src="../js/userMan.js"></script>
</head>
<body>
</body>
</html>

可以看出这个页面除了引用文件说明什么也没有,这就对了,因为所有的内容在userMan.js中。下面看一下userMan.js

//引入扩展组件
Ext.Loader.setConfig({enabled: true});

Ext.Loader.setPath('Ext.ux', '../../ExtJS4.2/ux/');

Ext.require([
    'Ext.data.*',
    'Ext.grid.*',
    'Ext.util.*',
    'Ext.tip.QuickTipManager',
    'Ext.ux.data.PagingMemoryProxy',
    'Ext.ux.ProgressBarPager'
]);

Ext.onReady(function() {
    //创建列
   var columns = [
                   {xtype: 'rownumberer'},//创建Ext.grid.RowNumberer的实例。Ext.grid.RowNumberer:它是一个为每行提供编号的列。
                   {header:'编号',dataIndex:'id',hidden: true},
                   {header:'用户名',dataIndex:'name'},
                   {header:'年龄',dataIndex:'age'},//年龄
                   {header:'性别',dataIndex:'sex',renderer:function(value){  
                       if(value=='男'){  
                           return "<span style='color:green;font-weight:bold';>男</span>";  
                       } else {  
                           return "<span style='color:red;font-weight:bold';>女</span>";  
                       }
                   }},
                   {header:'地址',dataIndex:'address'},
                   {header:'身份证号码',dataIndex:'cardId',width:150},
                   {header:'角色',dataIndex:'roleId'},
                   {header:'部门',dataIndex:'deptId'}
               ];
    //创建仓库
    var store = Ext.create("Ext.data.Store",{
        pageSize:20, //每页显示几条数据
        //采用代理方式向服务端发送请求,获取数据
        proxy:{  
            type:'ajax',  
            url:'/user/showUser',  
            reader:{  
                type:'json',  
                totalProperty:'total',//总记录数
                root:'data', //数据
                idProperty:'id'  //主键
            }  
        },  
        fields:[  //字段。reader是根据这里的字段信息来解析返回的数据的。
           {name:'id'}, //mapping:0 这样的可以指定列显示的位置,0代表第1列,可以随意设置列显示的位置  
           {name:'name'},  
           {name:'age'},  
           {name:'sex'},
           {name:'address'},
           {name:'cardId'},
           {name:'roleId'},
           {name:'deptId'}
        ]  
    });
    
    var sm = Ext.create('Ext.selection.CheckboxModel');
    var grid = Ext.create("Ext.grid.Panel",{
        region: 'center',
        border: false,
        store: store,
        selModel: sm,//选择模式是“复选框”
        columns: columns,
        region: 'center', //框架中显示位置,单独运行可去掉此段
        loadMask:true, //显示遮罩和提示功能,即加载Loading……  
        forceFit:true, //自动填满表格  
        columnLines:false, //列的边框
        rowLines:true, //设置为false则取消行的框线样式
        dockedItems: [{
            xtype:'toolbar',
            dock:'top',
            displayInfo: true,
            items:[{ xtype: 'textfield',name: 'name',fieldLabel: '用户名',labelAlign:'left',labelWidth:65},
                   { xtype: 'textfield',name: 'dept',fieldLabel: '部门',labelAlign:'left',labelWidth:35},
                   { xtype: 'textfield',name: 'role',fieldLabel: '角色',labelAlign:'left',labelWidth:35},
                   { xtype: 'button', text: '查询',iconCls:'Usermagnify'},
                   { xtype: 'button', text: '显示全部',iconCls:'Applicationformmagnify'}]
        },{
            xtype:'toolbar',
            dock:'top',
            displayInfo: true,
            items:[
                   '-',
                   { xtype: 'button', text: '增加用户',iconCls:'Useradd',
                       listeners: {
                           click:function(){
                               Ext.Msg.alert("增加用户","增加用户啦");
                           }
                       }
                   },'-',
                   { xtype: 'button', id:'editUser', text: '编辑用户',disabled:true,iconCls:'Useredit',//disabled:true 该button处于禁用状态
                       listeners: {
                           click:function(){
                               Ext.Msg.alert("编辑用户","编辑用户啦");
                           }
                       }},'-',
                   { xtype: 'button', id:'delUser', text: '删除用户',disabled:true,iconCls:'Userdelete',
                       listeners: {
                           click:function(){
                               Ext.Msg.alert("删除用户","删除用户啦");
                           }
                       }},'-',
                   { xtype: 'button', id:'allotUser', text: '分配角色',disabled:true,iconCls:'Usergo',
                       listeners: {
                           click:function(){
                               Ext.Msg.alert("分配","分配用户啦");
                           }
                       }},
                   { xtype: 'button', text: '导入',iconCls:'Databasecopy',
                       listeners: {
                           click:function(){
                               Ext.Msg.alert("导入","导入用户啦");
                           }
                       }},'-',
                   { xtype: 'button', text: '导出',iconCls:'Pagewhiteoffice',menu:{//菜单属性
                       items:[{//子组件的默认xtype是panel
                           text:'导出EXCEL',
                           iconCls:'Pageexcel',
                           listeners: {
                               click:function(){
                                   Ext.Msg.alert("导出Excel","导出Excel");
                               }
                           }
                       },{
                           text:'导出CSV',
                           iconCls:'Pagegreen',
                           listeners: {
                               click:function(){
                                   //Ext.getCmp('editUser').setDisabled(true);
                                   Ext.Msg.alert("导出CSV","导出CSV");
                               }
                           }
                       }]
                   }},'-',
                   { xtype: 'button', text: '打印',iconCls:'Printer',
                       listeners: {
                           click:function(){
                               Ext.Msg.alert("打印","打印");
                           }
                       }}],
        },{
            xtype: 'pagingtoolbar',//分页工具栏
            store: store,   // GridPanel使用相同的数据源
            dock: 'bottom',
            displayInfo: true,
            plugins: Ext.create('Ext.ux.ProgressBarPager'),//分页进度条
            emptyMsg: "没有记录" //没有数据时显示信息
        }]
    });
    //加载数据
    store.load({params:{start:0,limit:20}}); 
    // 表格配置结束
    
    //监听表格(为表格的选择模型添加selectionchange事件)
    grid.getSelectionModel().on({//getSelectionModel:返回grid的选择模型。on:是addListener的简写方法
        selectionchange: function(sm, selections) {//一个选项发生改变之后触发。参数:selections:选择的记录
            if (selections.length) {//如果有被选中的记录,则‘修改用户’、‘删除用户’、‘分配角色’三个按钮设置为可用状态
                Ext.getCmp('editUser').setDisabled(false);//getCmp:返回指定id的组件
                Ext.getCmp('delUser').setDisabled(false);
                Ext.getCmp('allotUser').setDisabled(false);
            } else {//反之,这三个按钮设置为禁用状态。
                Ext.getCmp('editUser').setDisabled(true);
                Ext.getCmp('delUser').setDisabled(true);
                Ext.getCmp('allotUser').setDisabled(true);
            }
        }
    });
    
    //表格右键菜单  
    var contextmenu = new Ext.menu.Menu({  
        id:'theContextMenu',  
        items:[{  
            text:'增加用户',
            iconCls:'Useradd',
            handler:function(){  
                Ext.Msg.alert("系统提示","增加用户");  
            }  
        },'-',{  
            text:'编辑用户',
            iconCls:'Useredit',
            handler:function(){  
                Ext.Msg.alert("系统提示","编辑用户");  
            }  
        },'-',{  
            text:'删除用户',
            iconCls:'Userdelete',
            handler:function(){  
                Ext.Msg.alert("系统提示","删除用户");  
            }  
        },'-',{  
            text:'分配角色',
            iconCls:'Usergo',
            handler:function(){  
                Ext.Msg.alert("系统提示","分配角色");  
            }  
        },'-',{  
            text:'导入',
            iconCls:'Databasecopy',
            handler:function(){  
                Ext.Msg.alert("系统提示","导入");  
            }  
        },'-',{  
            text:'导出',
            iconCls:'Pagewhiteoffice',
            menu:{
                items:[{
                    text:'导出EXCEL',
                    iconCls:'Pageexcel',
                    listeners: {
                        click:function(){
                            Ext.Msg.alert("导出Excel","导出Excel");
                        }
                    }
                },{
                    text:'导出CSV',
                    iconCls:'Pagegreen',
                    listeners: {
                        click:function(){
                            //Ext.getCmp('editUser').setDisabled(true);
                            Ext.Msg.alert("导出CSV","导出CSV");
                        }
                    }
                }]
            }
        },'-',{  
            text:'打印',
            iconCls:'Printer',
            handler:function(){  
                Ext.Msg.alert("系统提示","打印");  
            }  
        }]  
    });  

    //为表格添加右键菜单事件
    grid.on("itemcontextmenu",function(view,record,item,index,e){ //on:addListener的简写方法. itemcontextmenu:选项的右键菜单事件 右键单击选项时触发。
        e.preventDefault();  //阻止浏览器默认行为处理事件。--Ext.EventObject
        contextmenu.showAt(e.getXY());  //contextmenu在特定的XY位置显示。 getXY:获取事件的页面坐标。--Ext.EventObject
    });

    //为表格添加双击事件
    grid.on("itemdblclick",function(grid, row){
        Ext.Msg.alert("系统提示","你双击啦!ID为:"+row.data.id);  
    });
    
    // 整体架构容器
    Ext.create("Ext.container.Viewport", {
        layout : 'border',
        autoHeight: true,
        border: false,
        items : [grid]
    });
});

 

分析:

1.布局:虽然只有一个子组件grid,但依然采用的是Viewport的布局方式。

 

2.插件

Extjs4.2加了很多拓展插件(4.1版本没有),所在的命名空间为'Ext.ux',如下图:

这里就用到了其中的一个插件:ProgressBarPager--分页进度条,所以在此js需加载此类:

//引入扩展组件
Ext.Loader.setConfig({enabled: true});

Ext.Loader.setPath('Ext.ux', '../../ExtJS4.2/ux/');

Ext.require([
    'Ext.data.*',
    'Ext.grid.*',
    'Ext.util.*',
    'Ext.tip.QuickTipManager',
    'Ext.ux.data.PagingMemoryProxy',
    'Ext.ux.ProgressBarPager'
]);

注:除了加载这个 'Ext.ux.ProgressBarPager'插件,对于其他的加载类笔者也不太明白为什么要加载?对于目前的功能,即使注释掉也没影响的,如下:

Ext.require([
    /*'Ext.data.*',
    'Ext.grid.*',
    'Ext.util.*',
    'Ext.tip.QuickTipManager',
    'Ext.ux.data.PagingMemoryProxy',*/
    'Ext.ux.ProgressBarPager'
]);

可能是再编辑一些更复杂的功能会需要把。

 

3.xtype: 'rownumberer'

在创建表格时的第一列就创建了'rownumberer'这个对象,在Extjs中,xtype:'..'是很常见的写法,它用于创建某个类的实例(有时没有这个,一般默认的xtype是panel)组件,api解释如下:

 

4.表格的事件

在显示用户数据的表格中涉及了2个事件:

一是某行是否被选中的事件,其定义如下:

    //监听表格(为表格的选择模型添加selectionchange事件)
    grid.getSelectionModel().on({//getSelectionModel:返回grid的选择模型。on:是addListener的简写方法
        selectionchange: function(sm, selections) {//一个选项发生改变之后触发。参数:selections:选择的记录
            if (selections.length) {//如果有被选中的记录,则‘修改用户’、‘删除用户’、‘分配角色’三个按钮设置为可用状态
                Ext.getCmp('editUser').setDisabled(false);//getCmp:返回指定id的组件
                Ext.getCmp('delUser').setDisabled(false);
                Ext.getCmp('allotUser').setDisabled(false);
            } else {//反之,这三个按钮设置为禁用状态。
                Ext.getCmp('editUser').setDisabled(true);
                Ext.getCmp('delUser').setDisabled(true);
                Ext.getCmp('allotUser').setDisabled(true);
            }
        }
    });

从以上代码可看出,监听表格的某行是否被选中所监听的对象并不是表格本身,而是这个表格所属的选择模型(此表格的选择模型是复选框),在其所属的选择模型上增加‘selectonchange’事件。

 

二是表格的右键菜单事件,如下:

 //表格右键菜单  
    var contextmenu = new Ext.menu.Menu({  
        id:'theContextMenu',  
        items:[{  
            text:'增加用户',
            iconCls:'Useradd',
            handler:function(){  
                Ext.Msg.alert("系统提示","增加用户");  
            }  
        },'-',{  
            text:'编辑用户',
            iconCls:'Useredit',
            handler:function(){  
                Ext.Msg.alert("系统提示","编辑用户");  
            }  
        },'-',{  
            text:'删除用户',
            iconCls:'Userdelete',
            handler:function(){  
                Ext.Msg.alert("系统提示","删除用户");  
            }  
        },'-',{  
            text:'分配角色',
            iconCls:'Usergo',
            handler:function(){  
                Ext.Msg.alert("系统提示","分配角色");  
            }  
        },'-',{  
            text:'导入',
            iconCls:'Databasecopy',
            handler:function(){  
                Ext.Msg.alert("系统提示","导入");  
            }  
        },'-',{  
            text:'导出',
            iconCls:'Pagewhiteoffice',
            menu:{
                items:[{
                    text:'导出EXCEL',
                    iconCls:'Pageexcel',
                    listeners: {
                        click:function(){
                            Ext.Msg.alert("导出Excel","导出Excel");
                        }
                    }
                },{
                    text:'导出CSV',
                    iconCls:'Pagegreen',
                    listeners: {
                        click:function(){
                            //Ext.getCmp('editUser').setDisabled(true);
                            Ext.Msg.alert("导出CSV","导出CSV");
                        }
                    }
                }]
            }
        },'-',{  
            text:'打印',
            iconCls:'Printer',
            handler:function(){  
                Ext.Msg.alert("系统提示","打印");  
            }  
        }]  
    });  

    //为表格添加右键菜单事件
    grid.on("itemcontextmenu",function(view,record,item,index,e){ //on:addListener的简写方法. itemcontextmenu:选项的右键菜单事件 右键单击选项时触发。
        e.preventDefault();  //阻止浏览器默认行为处理事件。--Ext.EventObject
        contextmenu.showAt(e.getXY());  //contextmenu在特定的XY位置显示。 getXY:获取事件的页面坐标。--Ext.EventObject
    });

从以上代码可看出,在表格中设置右键呼出菜单的功能是先定义菜单项,然后为表格添加监听,其事件就是“itemcontextmenu”。需注意的是,由于在window系统下有自带的右键菜单事件,所以一般都要在处理函数中阻止默认的处理事件。

 

5.一个细节:menu的子组件的xtype默认是panel?

先贴出代码:

                   { xtype: 'button', text: '导出',iconCls:'Pagewhiteoffice',menu:{//菜单属性
                       items:[{//子组件的默认xtype是panel
                           text:'导出EXCEL',
                           iconCls:'Pageexcel',
                           listeners: {
                               click:function(){
                                   Ext.Msg.alert("导出Excel","导出Excel");
                               }
                           }
                       },{
                           text:'导出CSV',
                           iconCls:'Pagegreen',
                           listeners: {
                               click:function(){
                                   //Ext.getCmp('editUser').setDisabled(true);
                                   Ext.Msg.alert("导出CSV","导出CSV");
                               }
                           }
                       }]
                   }},'-',

以上代码的作用是设置按钮并为它添加菜单——就是menu属性,在button类的api这样介绍此属性:

上面代码中menu的值就是一个菜单对象,它又包含2个子组件,在Ext.menu.Menu的api中解释items说默认的子组件的xtype为panel,如下:

那么其中的text属性应该存在于panel的配置选项中,可是查询没有,在menu中也没有查询到text属性。然后全局查找:

觉得此属性的来源比较靠谱是button类中的此属性——毕竟此菜单的父容器就是button。解释是:按钮里的文字。

现在问题已确定了:items的子组件xtype是默认的panel吗?下面把代码修改成显示的指定xtype为panel,如下:

                       items:[{//子组件的默认xtype是panel
                           xtype:'panel',
                           text:'导出EXCEL',
                           iconCls:'Pageexcel',
                           listeners: {
                               click:function(menu,item){
                                   console.log(menu);
                                   console.log(item);
                                   Ext.Msg.alert("导出Excel","导出Excel");
                               }
                           }
                       }

然后运行,不能正常显示了:

再设置:xtype:'button',

也不能正常显示:

再设置:xtype:'menu',

这一组件直接没了:

最后去掉xtype这个配置,还原,通过调试来看一下是否能确定其身份:

控制台打印的menu的信息如下:

似乎也没有任何迹象表明其身份。所以现在是很奇怪的:items中的两个组件的text属性属于button类;其监听中的click事件属于menu类,那么它自己的xtype到底是什么呢?

 

二、部门管理

执行原理同上,这里直接贴dept.js

//引入扩展组件
Ext.Loader.setConfig({enabled: true});

Ext.Loader.setPath('Ext.ux', '../../ExtJS4.2/ux/');

Ext.require([
    'Ext.data.*',
    'Ext.grid.*',
    'Ext.util.*',
    'Ext.tip.QuickTipManager',
    'Ext.ux.data.PagingMemoryProxy',
    'Ext.ux.ProgressBarPager'
]);
Ext.onReady(function() {
    Ext.define("DeptModel", {
        extend: "Ext.data.TreeModel",
        fields: [
            "id", "text", "status","description"
        ]
    });
    var store = Ext.create("Ext.data.TreeStore",{
        model: "DeptModel",
        proxy:{  
            type:'ajax',  
            url:'../config/treegrid.json' ///dept/showDept
        }
    });
    var columns = [{
                text: '编号',
                flex: 1,
                dataIndex: 'id',
                hidden: true,
                sortable: true
            },{
                xtype: 'treecolumn', //this is so we know which column will show the tree
                text: '名称',
                flex: 2,
                sortable: true,
                dataIndex: 'text'
            },{
                text: '状态',
                flex: 1,
                dataIndex: 'status',
                sortable: true,renderer:function(value){  
                    if(value==0){  
                        return "<span style='color:green;font-weight:bold';>正常</span>";  
                    } else {  
                        return "<span style='color:red;font-weight:bold';>停用</span>";  
                    }
                }
            },{
                text: '描述',
                flex: 1,
                dataIndex: 'description',
                sortable: true
            }];
    //var sm = Ext.create('Ext.selection.CheckboxModel');
    var tree = Ext.create('Ext.tree.Panel', {
        renderTo: Ext.getBody(),
        rootVisible: false,
        region: 'center',
        //selModel: sm,
        loadMask:true, //显示遮罩和提示功能,即加载Loading……  
        columnLines:false, //列的边框
        border: false,
        forceFit:true, //自动填满表格 
        rowLines:true, //设置为false则取消行的框线样式
        columns: columns,
        store:store
    });
    
    // 整体架构容器
    Ext.create("Ext.container.Viewport", {
        layout : 'border',
        autoHeight: true,
        border: false,
        items : [tree]
    });
});

数据源:treegrid.json

{
    "text": ".",
    "children": [
        {
            "id": "1",
            "text": "总部",
            "status": 0,
            "expanded": true,
            "description":"总部根节点",
            "leaf":false,
            "children": [
                {
                    "id": "2",
                    "text": "开发部",
                    "status": 0,
                    "description":"开发部",
                    "expanded": true,
                    "children": [
                        {
                            "id": "3",
                            "text": "测试部",
                            "status": 1,
                            "description":"开发部",
                            "leaf": true
                        }, {
                            "id": "4",
                            "text": "前端部",
                            "status": 0,
                            "description":"开发部",
                            "leaf": true
                        }, {
                            "id": "5",
                            "text": "质量部",
                            "status": 1,
                            "description":"开发部",
                            "leaf": true,
                        }, {
                            "id": "6",
                            "text": "版本控制部",
                            "status": 0,
                            "description":"开发部",
                            "leaf": true,
                        }
                    ]
                }, {
                    "id": "7",
                    "text": "项目部",
                    "status": 1,
                    "description":"开发部",
                    "expanded": true,
                    "children": [
                        {
                            "id": "8",
                            "text": "实施部",
                            "status": 0,
                            "description":"开发部",
                            "leaf": true
                        }, {
                            "id": "9",
                            "text": "运维部",
                            "status": 1,
                            "description":"开发部",
                            leaf:true
                        }
                    ]
                }
            ]
        },{
            "id": "10",
            "text": "总部2",
            "status": 0,
            "expanded": true,
            "description":"总部根节点",
            "leaf":false,
            "children": [
                {
                    "id": "11",
                    "text": "开发部2",
                    "status": 0,
                    "description":"开发部",
                    "expanded": true,
                    "children": [
                        {
                            "id": "12",
                            "text": "测试部2",
                            "status": 1,
                            "description":"开发部",
                            "leaf": true
                        }, {
                            "id": "13",
                            "text": "前端部2",
                            "status": 0,
                            "description":"开发部",
                            "leaf": true
                        }, {
                            "id": "14",
                            "text": "质量部2",
                            "status": 1,
                            "description":"开发部",
                            "leaf": true,
                        }, {
                            "id": "15",
                            "text": "版本控制部2",
                            "status": 0,
                            "description":"开发部",
                            "leaf": true,
                        }
                    ]
                }, {
                    "id": "16",
                    "text": "项目部2",
                    "status": 1,
                    "description":"开发部",
                    "expanded": true,
                    "children": [
                        {
                            "id": "17",
                            "text": "实施部2",
                            "status": 0,
                            "description":"开发部",
                            "leaf": true
                        }, {
                            "id": "18",
                            "text": "运维部2",
                            "status": 1,
                            "description":"开发部",
                            leaf:true
                        }
                    ]
                }
            ]
        }
    ]
}

 

转载于:https://www.cnblogs.com/wql025/p/5042152.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《精通JS脚本之ExtJS框架》由浅入深地讲解了ExtJS在Web开发中的相关技术。本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计进度条、设计工具栏和菜单栏、设计面板、设计表格、设计表单、设计数据表、对Ajax的支持以及如何调试等。最后利用一个商品信息管理系统和一个企业任务管理系统,向读者演示了ExtJS在实际项目中的应用以及实现流程。   《精通JS脚本之ExtJS框架》附有配套光盘,提供了书中实例的源代码和视频教学文件。此外,读者还可以通过访问itzcn网站来获得即时在线帮助。   《精通JS脚本之ExtJS框架》可以作为Web开发的自学参考书,也可以作为RIA Web程序开发的培训教材。 第1章 JavaScript入门必备 1.1 JavaScript语言概述 1.1.1 JavaScript简介 1.1.2 JavaScript特点 1.1.3 JavaScript与Java 1.2 第一个JavaScript程序 1.2.1 嵌入JavaScript 1.2.2 链接外部JavaScript文件 1.2.3 注意事项 1.3 基础语法 1.3.1 数据类型 1.3.2 变量与常量 1.3.3 运算符 1.4 流程控制语句 1.4.1 if条件语句 1.4.2 switch条件语句 1.4.3 while循环语句 1.4.4 do while循环语句 1.4.5 for循环语句 1.4.6 for in循环语句 1.4.7 try catch finally语句 1.4.8 其他语句 第2章 JavaScript浏览器对象模型与事件处理 2.1 浏览器对象模型 2.1.1 文档对象 2.1.2 表单及其元素对象 2.1.3 浏览器信息对象 2.1.4 窗口对象 2.1.5 网址对象 2.1.6 历史记录对象 2.2 基本事件处理 2.3 2级DOM事件模型 2.3.1 事件传播 2.3.2 注册事件处理程序 2.3.3 event对象 2.4 常用事件 2.4.1 键盘事件 2.4.2 鼠标事件 2.4.3 页面事件 第3章 开始使用ExtJS 3.1 ExtJS概述 3.1.1 ExtJS简介 3.1.2 ExtJS中的基本概念 3.1.3 ExtJS与常见JavaScript库的介绍与对比 3.2 创建第一个程序 3.2.1 下载ExtJS 3.2.2 部署到开发工具中 3.2.3 编写HelloWorld.html 3.2.4 运行调试ExtJS 3.3 辅助开发 3.3.1 调试工具Firebug 3.3.2 开发利器Spket 第4章 ExtJS事件机制 4.1 设计模式——观察者模式 4.2 自定义事件 4.3 浏览器事件 4.4 ExtJS中的事件 4.4.1 Function.call()/apply()方法 4.4.2 函数的作用域 4.4.3 Ext.lib.Event事件 4.4.4 Ext.util.Observable事件 4.4.5 Ext.EventManager事件 4.4.6 Ext.EventObject事件 4.5 各种事件登记方式 4.5.1 传统式登记 4.5.2 内联式登记 4.5.3 Dom Level2登记 4.6 高级组件事件 4.7 ExtJS键盘事件 第5章 ExtJS组件 5.1 核心组件 5.1.1 ExtJS组件结构 5.1.2 Ext.Component 5.1.3 Ext.BoxComponent 5.1.4 Ext.Container 5.1.5 Ext.Panel 5.1.6 Ext.TabPanel 5.2 信息提示框组件 5.2.1 Ext.MessageBox简介 5.2.2 Ext.MessageBox.alert() 5.2.3 Ext.MessageBox.confirm() 5.2.4 Ext.MessageBox.prompt() 5.2.5 Ext.MessageBox.wait() 5.2.6 Ext.MessageBox.show() 5.2.7 Ext.MessageBox的其他功能 5.3 进度条组件 5.3.1 Ext.ProgressBar简介 5.3.2 手工模式的进度条 5.3.3 自动模式的进度条 5.3.4 自定义样式的进度条 5.4 工具栏和菜单栏 5.4.1 Ext.Toolbar简介 5.4.2 只包含按钮的简单工具栏 5.4.3 包含多种元素的复杂工具栏 5.4.4 Ext.menu.Menu简介 5.4.5 最简单的菜单栏 5.4.6 创建三级或多级菜单 5.4.7 具有选择框的菜单 第6章 页面元素与模板 6.1 构成用户界面的元素 6.2 获取页面元素 6.3 元素常见的使用方法 6.3.1 常见的“显示/隐藏”方法 6.3.2 常见的“内容控制”方法 6.3.3 常见的“操控DOM”方法 6.3.4 常见的“尺寸大小/定位”方法 6.3.5 常见的“特效动画”方法 6.3.6 DomHelper简介 6.4 DomQuery入门 6.4.1 元素选择符Selector 6.4.2 属性选择符Attributes Selectors 6.4.3 CSS值元素选择符 6.4.4 Ext.query与Ext.select 6.5 应用模板 6.5.1 Ext.Template 6.5.2 Ext.XTemplate 第7章 设计表单类布局 7.1 Form表单简介 7.1.1 Form表单的基本配置 7.1.2 ExtJS对Form表单的封装 7.2 ExtJS的表单组件 7.2.1 文本输入控件Ext.form.TextField 7.2.2 多行文本输入控件Ext.form.TextArea 7.2.3 单选框 7.2.4 复选框 7.2.5 下拉列表框 7.2.6 日期输入控件Ext.form.DateField 7.2.7 在线编辑器Ext.form.HtmlEditor 7.3 ExtJS表单组件的综合应用 第8章 设计表格类布局 8.1 表格简介 8.1.1 表格的基本属性 8.1.2 制作第一个表格 8.2 表格常用功能详解 8.2.1 主要属性功能 8.2.2 自定义列宽度 8.2.3 执行按列排序 8.2.4 解决中文排序 8.2.5 格式化显示日期类型数据 8.3 美化表格 8.4 设置表格背景颜色 8.5 显示行号和复选框 8.5.1 显示行号 8.5.2 引用复选框 第9章 表格的高级功能 9.1 表格视图——Ext.grid.GridView 9.2 表格分页 9.2.1 添加表格分页显示工具条 9.2.2 从后台脚本获得分页数据 9.2.3 在表格顶部显示分页工具条 9.2.4 实现前台分页效果 9.3 可编辑表格控件——EditorGrid 9.3.1 制作第一个EditorGrid 9.3.2 添加一行数据 9.3.3 保存修改结果 9.3.4 验证EditGrid中的数据 9.3.5 限制输入数据的类型 9.4 PropertyGrid属性表格控件 9.4.1 PropertyGrid简介 9.4.2 只读的PropertyGrid 9.4.3 对name列强制排序并获得value 9.4.4 自定义编辑器 9.5 分组表格控件——Group 9.5.1 分组表格简介 9.5.2 Ext.grid.GroupingView的配置操作 9.6 可拖放的表格 9.6.1 拖放改变表格的大小 9.6.2 在同一个表格里拖放 9.6.3 表格之间的拖放 9.6.4 表格与树之间的拖放 第10章 设计树状结构布局 10.1 TreePanel的基本使用 10.1.1 创建一棵树 10.1.2 为树生枝展叶 10.1.3 树形的配置 10.1.4 使用TreeLoader获得数据 10.1.5 读取本地JSON数据 10.2 树的事件 10.3 右键菜单 10.4 修改节点的默认图标 10.5 从节点弹出对话框 10.6 节点提示信息 10.7 为节点设置超链接 10.8 树形的拖放 10.8.1 节点拖放的3种形式 10.8.2 叶子不能append 10.8.3 判断拖放的目标 10.8.4 树之间的拖放 10.9 树形过滤器TreeFilter 10.10 利用TreeSorter对树进行排序 10.11 树形节点视图——Ext.tree.TreeNodeUI 10.12 表格与树形的结合——Ext.ux.tree.ColumnTree 第11章 其他布局类简介 11.1 标准布局类 11.1.1 折叠布局——AccordionLayout 11.1.2 边框布局——BorderLayout 11.1.3 卡片式布局——CardLayout 11.1.4 列布局——ColoumnLayout 11.1.5 锚点布局——AnchorLayout 11.1.6 自适应布局——FitLayout 11.1.7 ContainerLayout 11.2 与布局有关的其他知识 11.2.1 父类Ext.Container公共配置与xtype的概念 11.2.2 使用Viewport 11.2.3 实现表单元素横排 第12章 ExtJS对Ajax的支持 12.1 Ext.Ajax介绍 12.1.1 Ext.Ajax.request方法详解 12.1.2 Ext.Ajax.request操作示例 12.1.3 Ext.Ajax.request提交XML数据 12.2 Ext.Updater基础 12.2.1 Ext.Updater.update方法 12.2.2 Ext.Updater.update操作示例 12.3 利用Ajax优化Web应用框架 12.3.1 多级联动菜单 12.3.2 Ajax修改用户密码 12.3.3 自动保存的网络记事本 12.3.4 网页计算器 第13章 设计数据驱动模式 13.1 XML/JSON数据格式比较 13.2 容器类MixedCollection 13.3 数据存储基本单元Record与dataField 13.3.1 dataField 13.3.2 Record 13.4 数据存储store 13.4.1 数据载入 13.4.2 对数据进行排序 13.4.3 从store 中获取数据 13.4.4 更新store 中的数据 13.4.5 加载及显示数据 13.5 数据代理 13.5.1 Ext.data.DataProxy 13.5.2 Ext.data.MemoryProxy 13.5.3 Ext.data.HttpProxy 13.5.4 Ext.data.ScriptTagProxy 13.6 数据读取器 13.6.1 Ext.data.DataReader 13.6.2 Ext.data.ArrayReader 13.6.3 Ext.data.JsonReader 13.6.4 Ext.data.XmlReader 13.7 Ext.ux.DWR 13.7.1 Ext.data.DwrProxy 13.7.2 Ext.data.DWRTreeLoader 13.7.4 Web服务端配置 13.7.5 服务层接口 第14章 ExtJS扩展 14.1 利用Ext.extend实现继承 14.2 与ExtJS扩展相关的预备知识 14.2.1 定义命名空间 14.2.2 使用xtype 14.3 用户扩展和插件 14.3.1 编写自定义用户扩展 14.3.2 常用插件UploadDialog 14.3.3 常用插件ManagedIFrame 14.4 使用ExtJS制作Flash统计报表 14.4.1 柱状图 14.4.2 折线图 14.4.3 饼状图 14.4.4 柱状栈图 第15章 调试JavaScript与HTML 15.1 Firebug的基本使用 15.1.1 开启或关闭Firebug 15.1.2 控制台 15.2 Firebug的应用 15.2.1 源代码调试 15.2.2 CSS调试 15.2.3 脚本调试 15.3 跟踪网络传输状态 15.4 在脚本文件中加入调试命令 15.5 在IE中使用Firebug 15.5.1 前端调试利器DebugBar 15.5.2 IE下的优秀JavaScript调试工具Companion.JS 15.5.3 DebugBar和Companion.JS的基本操作 15.6 调试技巧 15.6.1 在Firebug中直接调试脚本 15.6.2 调试代码运行速度 15.6.3 查看对象属性 第16章 ExtJS案例:商品信息管理系统 16.1 商品信息管理系统功能介绍 16.2 数据库设计和实现 16.2.1 数据库概念结构设计 16.2.2 数据库表设计 16.3 为项目做好准备 16.4 登录界面 16.5 栏目加载 16.6 为项目换肤 16.7 商品信息管理 16.7.1 商品信息的查询 16.7.2 商品信息的添加 16.7.3 商品信息的删除 16.7.4 商品信息的更新 第17章 ExtJS案例:企业任务管理系统 17.1 系统概述 17.2 需求分析 17.3 数据库设计 17.4 员工任务管理 17.4.1 个人任务处理 17.4.2 个人资料编辑 17.5 主管任务管理 17.5.1 部门计划处理 17.5.2 部门人员管理 17.6 系统管理员权限分配
前言 第1章 认识ExtJS 1.1 ExtJS的精彩表现 1.2 ExtJS的前世今生 1.3 是否真的需要学习ExtJS 1.4 ExtJS4.0新特性 1.5 ExtJSUI组件基础 1.6 了解一下类似技术 1.7 本章小结 第2章 开始ExtJS之旅 2.1 认识ExtJS的开发包 2.2 也从Helloworld开始 2.3 ExtJS中的基本概念 2.4 非常有用的开发工具 2.4.1 开发插件spket 2.4.2 FullSource 2.4.3 MicrosoftScriptDebugger 2.5 ExtJS对原有JavaScript对象的扩展 2.5.1 Ext.Array 2.5.2 Ext.Date 2.5.3 Ext.Function 2.5.4 Ext.Number 2.5.5 Ext.String 2.5.6 Ext.Object 2.6 本章小结 第3章 ExtJS4.0的基本功能 3.1 ExtJS组件配置说明 3.1.1 JSON介绍 3.1.2 ExtJS组件配置方式介绍 3.2 信息提示框组件介绍 3.2.1 认识Ext.window.MessageBox 3.2.2 Ext.MessageBox.alert() 3.2.3 Ext.MessageBox.confirm() 3.2.4 Ext.MessageBox.prompt() 3.2.5 Ext.MessageBox.wait() 3.2.6 Ext.MessageBox.show() 3.2.7 Ext.window.MessageBox的其他功能 3.3 进度条组件介绍 3.3.1 认识Ext.ProgressBar 3.3.2 手工模式的进度条 3.3.3 自动模式的进度条 3.3.4 自定义样式的进度条样式 3.4 实现工具栏和菜单栏 3.4.1 认识Ext.toolbar.Toolbar 3.4.2 只包含按钮的简单工具栏 3.4.3 包含多种元素的复杂工具栏 3.4.4 启用和禁用工具栏 3.4.5 认识Ext.menu.Menu菜单 3.4.6 最简单的菜单栏 3.4.7 创建二级或多级菜单 3.4.8 将更多组件加入菜单 3.4.9 具有选择框的菜单 3.5 本章小结 第4章 最常用的表单 4.1 表单及表单元素 4.1.1 了解Ext.form.Basic基本表单 4.1.2 认识Ext.form.Panel表单面板 4.1.3 Ext.form.field.Base基础表单字段 4.1.4 Ext.form.field.Text文本域 4.1.5 Ext.form.field.TextArea文本区 4.1.6 Ext.form.field.Number数字输入框 4.1.7 Ext.form.field.Checkbox复选框和Ext.form.field.Radio单选框 4.1.8 Ext.form.CheckboxGroup和Ext.form.RadioGroup 4.1.9 Ext.form.field.Trigger触发字段 4.1.10 Ext.form.field.Spinner微调字段 4.1.11 Ext.form.field.Picker拾取器字段 4.1.12 Ext.form.field.ComboBox组合框 4.1.13 Ext.form.field.Time时间选择框 4.1.14 Ext.form.field.Date日期选择框 4.1.15 Ext.form.field.Hidden隐藏字段 4.1.16 Ext.form.field.HtmlEditor编辑器字段 4.1.17 Ext.form.field.Display只读文本字段 4.1.18 Ext.form.Label标签字段 4.1.19 Ext.form.FieldSet字段集 4.1.20 Ext.form.FieldContainer容器字段 4.1.21 Ext.form.field.File文件上传字段 4.2 实现表单验证 4.2.1 常见的验证类型 4.2.2 表单验证(VType) 4.2.3 自定义VType验证 4.3 表单的提交和加载 4.3.1 Ext.form.action.Action基础 4.3.2 Ajax模式的表单数据加载 4.3.3 Ajax模式的表单数据提交 4.3.4 标准模式的表单数据提交 4.3.5 使用Direct技术 4.4 本章小结 第5章 面板及布局类 5.1 面板panel 5.1.1 认识Ext.panel.Panel 5.1.2 Ext.panel.Panel的主要功能 5.1.3 使用Ext.panel.Panel 5.2 标准布局类 5.2.1 Auto自动布局 5.2.2 Fit自适应布局 5.2.3 Accordion折叠布局 5.2.4 Card卡片式布局 5.2.5 Anchor锚点布局 5.2.6 Absolute绝对位置布局 5.2.7 CheckboxGroup复选框组布局 5.2.8 Column列布局 5.2.9 Table表格布局 5.2.1 0Border边框布局 5.2.1 1Box盒布局 5.3 使用ViewPort 5.4 Ext.tab.Panel页签 5.5 本章小结 第6章 常用工具类与函数 6.1 非常有用的Ext.core.Element 6.2 Ext常用函数 6.2.1 Ext.onReady() 6.2.2 Ext.get() 6.2.3 Ext.select() 6.2.4 Ext.query() 6.2.5 Ext.getCmp() 6.2.6 Ext.getDom() 6.2.7 Ext.isEmpty() 6.2.8 Ext.namespace() 6.2.9 Ext.each() 6.2.1 0Ext.apply() 6.2.1 1Ext.encode() 6.2.1 2Ext.htmlDecode() 6.2.1 3Ext.typeOf() 6.3 Ext.core.DomHelper 6.3.1 Ext.core.DomHepler.append() 6.3.2 Ext.core.DomHelper.applyStyles() 6.3.3 createTemplate() 6.3.4 insertAfter() 6.3.5 insertBefore() 6.3.6 insertFirst() 6.3.7 insertHtml() 6.3.8 overwrite() 6.4 Ext.core.DomQuery 6.4.1 compile() 6.4.2 filter() 6.4.3 is() 6.4.4 jsSelect() 6.4.5 selectNode() 6.5 Ext.util.CSS 6.5.1 createStyleSheet() 6.5.2 getRule() 6.5.3 swapStyleSheet() 6.5.4 removeStyleSheet() 6.6 Ext.util.ClickRepeater 6.6.1 click() 6.6.2 mousedown() 6.6.3 mouseup() 6.7 Ext.util.DelayedTask提供setTimeout的简单替代 6.7.1 cancle() 6.7.2 delay() 6.8 Ext.util.Format提供常用的格式化方法 6.8.1 ellipsis() 6.8.2 capitalize() 6.8.3 date() 6.8.4 htmlEncode() 6.8.5 htmlDecode() 6.8.6 stripTags() 6.8.7 substr() 6.8.8 lowercase() 6.8.9 number() 6.8.10 round() 6.9 Ext.util.JSON编码和解码Json对象 6.9.1 decode() 6.9.2 encode() 6.10 Ext.util.MixedCollection 6.10.1 向集合加入对象 6.10.2 将数组中的对象加入到集合中 6.10.3 移除集合中的对象 6.10.4 克隆集合 6.10.5 匹配集合中关联对象 6.10.6 迭代集合中的对象调用指定的方法 6.10.7 获取集合中的对象 6.10.8 该类中的其他一些有用的方法 6.10.9 该类中重要的事件(Events) 6.11 Ext.util.TaskRunner 6.11.1 构造函数 6.11.2 启动一个线程start() 6.11.3 停止一个线程stop() 6.11.4 停止所有的线程stopAll() 6.12 Ext.util.TextMetrics得到块状化文本规格 6.12.1 块的绑定 6.12.2 实例化对象 6.12.3 获取文本的高度 6.12.4 获取文本的宽、高 6.12.5 获取文本的宽度 6.12.6 获取指定节点内文本块的宽、高 6.12.7 指定文本块的宽 6.13 Ext.KeyNav为元素提供简单的按键处理方法 6.13.1 实例化一个键盘绑定对象 6.13.2 废弃原有键盘绑定 6.13.3 将废弃的键盘绑定重新生效 6.14 Ext.KeyMap提供更灵活强大的对按键的处理方法 6.14.1 构造函数 6.14.2 给对象添加键盘绑定 6.14.3 废弃已绑定到KeyMap的配置 6.14.4 将KeyMap或废弃的配置重新生效 6.14.5 获取当前KeyMap配置是否为有效 6.14.6 事件绑定函数 6.15 本章小结 第7章 让ExtJS开始响应事件 第8章 常见Web框架的ExtJS改造 第9章 ExtJS对Ajax的支持 第10章 增强型模板 第11章 数据模型 第12章 Grid组件 第13章 Tree组件 第14章 ExtJS与服务端框架的整合 第15章 主题 第16章 Ext.Direct 第17章 Draw图形 第18章 Chart图表 附录A
系统可作为OA、网站、电子政务、ERP、CRM、APP后台等基于B/S架构的应用软件系统的快速开发框架。 一、特色功能 1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王星,支持多浏览器和多分辨率。 3、分别封装了模型层、控制层、业务逻辑层和数据持久层的通用操作模块,层次分明,大大减少代码冗余,二次开发效率高。 4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 4.2.1.883无限制版本,放心用于网站开发。 2、ExtJS富文本编辑器增加修改信息。 3、ExtJS的HtmlEditor的图片文件上传插件。 4、Grid列表和表单,包含添加、删除、批量删除、修改、查看、图片查看和按条件查询列表等功能。 5、导入导出Excel数据,支持xlsx和xls文件。 6、资源管理(菜单管理)。 7、用户管理和部门管理。 8、权限管理。不仅可管理各个功能模块的权限,也可以管理功能模块里的页面按钮权限。 9、报表统计。也可以嵌入其他报表工具插件。 10、采用开源的互动地图Javascript库Leaflet,处理自定义在线地图。Panel里包含2个组件,在2个组件间传递参数显示数据。 三、开发工具和采用技术 1、开发工具:Eclipse、MyEclipse和其他IDE。 2、采用Spring 3中最新最稳定的Spring MVC 3.2.8版本。 3、采用Hibernate 4.1.7。Spring MVC 3.2.8支持的最高Hibernate版本是4.1.7,更高的Hibernate版本和Spring MVC 3.2.8组合会遇到兼容问题。 4、Hibernate集成二级缓存框架Ehcache。 5、数据库是MySQL、Oracle和SQL Server,Hibernate的Dialect可使程序移植到其他数据库。 6、采用开源的互动地图Javascript库Leaflet,处理自定义在线地图。 7、采用Google Guava Collections,性能高于Apache Collections。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值