zoukankan      html  css  js  c++  java
  • [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列

    引言

    贴一个grid 的例子先:

    有这样一个需求:

    1. 给 Grid(or Tree Grid)添加一列, 这一列显示是Button. 点击之后可以对这一行进行一些操作

    2. 这一列每一行对应的按钮不尽相同, 根据每一行的数据不同,显示的按钮不同,对应的点击操作也不同。

    解法

    针对以上需求1 , 很容易就可以解决。

    Ext JS 的Grid 有提供 Ext.grid.column.ActionView   xtype: actioncolumn 这样的列。

    只需要在grid panel 的columns 配置 一栏的xtype为actioncolumn;配置icon 为显示的按钮图;配置handler点点击的动作就可以了。

    贴一个完整的例子:

    <!-- add by oscar999 -->
    <!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>Insert title here</title>
    <script type="text/javascript" src="../ext-all.js"></script>
    <link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css"/>
    
    <script>
    Ext.onReady(function(){
    	Ext.create('Ext.data.Store', {
    	    storeId:'simpsonsStore',
    	    fields:['name', 'email', 'phone'],
    	    data:{'items':[
    	        { 'name': 'Lisa',  "email":"lisa@simpsons.com",  "phone":"555-111-1224"  },
    	        { 'name': 'Bart',  "email":"bart@simpsons.com",  "phone":"555-222-1234" },
    	        { 'name': 'Homer', "email":"home@simpsons.com",  "phone":"555-222-1244"  },
    	        { 'name': 'Marge', "email":"marge@simpsons.com", "phone":"555-222-1254"  }
    	    ]},
    	    proxy: {
    	        type: 'memory',
    	        reader: {
    	            type: 'json',
    	            root: 'items'
    	        }
    	    }
    	});
    
    	Ext.create('Ext.grid.Panel', {
    	    title: 'Simpsons',
    	    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    	    columns: [
    	        { text: 'Name',  dataIndex: 'name' },
    	        { text: 'Email', dataIndex: 'email', flex: 1 },
    	        { text: 'Phone', dataIndex: 'phone' },
    	        { text: 'Actions', xtype: 'actioncolumn',icon:'../resources/themes/images/access/grid/checked.gif',handler:function(){alert("hello")}}
    	    ],
    	    height: 200,
    	     400,
    	    renderTo: Ext.getBody()
    	});
    });
    </script>
    
    </head>
    <body>
    
    </body>
    </html>


    如果要添加多个图标按钮也很简单

    	        { text: 'Actions', xtype: 'actioncolumn',
    	          items:[{
    	        	  icon:'../resources/themes/images/access/grid/checked.gif',handler:function(){alert("hello")}
    	        	  },{
    	        	  icon:'../resources/themes/images/access/grid/columns.gif',handler:function(){alert("hello")}
    	        	  }	                
    	          ]
    	        }

    现在的问题就是, 如何根据这一行其他栏的值显示不同的图标按钮?

    在早期使用Ext js 3 的时候, 有使用过这种方法来解决这个问题:(不确定Ext js 3 是否支持下面提到的新的方法)

    旧的方法:

    把图标组成 <img src="" onclick/> 这样的字串,当成值放入这一列。 这种传输和控制上来说都不是很好。

    下面给出新的方法。

    新的 Ext.grid.column.ActionView 组件有提供 getClass 这样的配置项,
    关于这个配置项的解释是:

    getClass : Function
    
    A function which returns the CSS class to apply to the icon image.
    
    Available since: 3.4.0
    Parameters
    
        v : Object
    
        The value of the column's configured field (if any).
        metadata : Object
    
        An object in which you may set the following attributes:
            css : String
    
            A CSS class name to add to the cell's TD element.
            attr : String
    
            An HTML attribute definition string to apply to the data container element within the table cell (e.g. 'style="color:red;"').
        r : Ext.data.Model
    
        The Record providing the data.
        rowIndex : Number
    
        The row index.
        colIndex : Number
    
        The column index.
        store : Ext.data.Store
    
        The Store which is providing the data Model.
    


    一句话来说,就是这个配置可以根据当前行的其他栏位的值返回按钮行不同的 iconClass 。  这样岂不就就可以解决问题了:

    还是贴一个完整的例子:

    <!-- add by oscar999 -->
    <!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>Insert title here</title>
    <script type="text/javascript" src="../ext-all.js"></script>
    <link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css"/>
    <style type="text/css">
    .icon1{
    	background-image: url("../resources/themes/images/access/grid/checked.gif"); 
    	background-repeat: no-repeat;
    }
    .icon2{
    	background-image: url("../resources/themes/images/access/grid/columns.gif"); 
    	background-repeat: no-repeat;
    }
    </style>
    <script>
    Ext.onReady(function(){
    	Ext.create('Ext.data.Store', {
    	    storeId:'simpsonsStore',
    	    fields:['name', 'email', 'phone'],
    	    data:{'items':[
    	        { 'name': 'Lisa',  "email":"lisa@simpsons.com",  "phone":"555-111-1224"  },
    	        { 'name': 'Bart',  "email":"bart@simpsons.com",  "phone":"555-222-1234" },
    	        { 'name': 'Homer', "email":"home@simpsons.com",  "phone":"555-222-1244"  },
    	        { 'name': 'Marge', "email":"marge@simpsons.com", "phone":"555-222-1254"  }
    	    ]},
    	    proxy: {
    	        type: 'memory',
    	        reader: {
    	            type: 'json',
    	            root: 'items'
    	        }
    	    }
    	});
    
    	Ext.create('Ext.grid.Panel', {
    	    title: 'Simpsons',
    	    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    	    columns: [
    	        { text: 'Name',  dataIndex: 'name' },
    	        { text: 'Email', dataIndex: 'email', flex: 1 },
    	        { text: 'Phone', dataIndex: 'phone' },
    	        { text: 'Actions', xtype: 'actioncolumn',
                  getClass: function(v, meta, rec) {
                	  if(rec.get("name")=="Lisa")
                	  {
                		  return 'icon1';
                	  }else{
                		  return 'icon2';
                	  }
                  }
    		    }	        	  
    	    ],
    	    height: 200,
    	     400,
    	    renderTo: Ext.getBody()
    	});
    });
    </script>
    
    </head>
    <body>
    
    </body>
    </html>


    当然, handler 也可以借助类似的方式

          handler: function(grid, rowIndex, colIndex) {
                            var rec = grid.getStore().getAt(rowIndex),
           }

    其他

    以上第一个例子是直接指定 icon 的位置, 也可以指定 iconCls 的值

     

  • 相关阅读:
    HDU 1813 Escape from Tetris
    BZOJ 2276 Temperature
    BZOJ 4499 线性函数
    BZOJ 3131 淘金
    HDU 5738 Eureka
    POJ 2409 Let it Bead
    POJ 1286 Necklace of Beads
    POJ 1696 Space Ant
    Fox And Jumping
    Recover the String
  • 原文地址:https://www.cnblogs.com/aukle/p/3235388.html
Copyright © 2011-2022 走看看