当前位置: 代码迷 >> JavaScript >> ext js总结3
  详细解决方案

ext js总结3

热度:323   发布时间:2012-10-06 17:34:01.0
ext js小结3
EXT JS学习1


1 GRIDPANEL中,比如某列的返回值,用图片表示:
  renderer:function(value, metadata, record, rowIndex, colIndex, store){
}

value:原始值
metadata:可能的值为css或attr
record:Ext.data.Record,GridPanal的记录结构定义
rowIndex:行索引
colIndex:列索引
store:Ext.data.Store,数据源

   renderer: function(v){
if(v == "男"){
return "<img src='../imgs/GGgif'>";
}else{
return "<img src='../imgs/MM.gif'>";
}
}

2 //列模型
var cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(),
{header: "姓名", width: 80, dataIndex: "Name", tooltip: "这是您的姓名"},
{header: "性别", width: 40, dataIndex: "Sex", align: "center",
renderer: function(v){
if(v == "男"){
return "<img src='../imgs/134.gif'>";
}else{
return "<img src='../imgs/133.gif'>";
}
}
},
{header: "生日", width: 100, format: "Y-m-d", dataIndex: "Birthday", renderer: Ext.util.Format.dateRenderer("Y-m-d")},

注意这里new Ext.grid.RowNumberer(),产生了一个序列号,
Ext.util.Format.dateRenderer("Y-m-d")},则产生了日期格式化

3
一个GRIDPANEL的例子:
  buttons: [{
text: "第一行",
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
rsm.selectFirstRow();
}
},{
text: "上一行",
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
if(!rsm.hasPrevious()){
Ext.Msg.alert("警告", "已到达第一行");
}else{
rsm.selectPrevious();
}
}
},{
text: "下一行",
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
if(!rsm.hasNext()){
Ext.Msg.alert("警告", "已到达最后一行");
}else{
rsm.selectNext();
}
}
},{
text: "最后一行",
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
rsm.selectLastRow();
}
},{
text: "全选"
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
rsm.selectAll();
}
},{
text: "全不选",
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
rsm.deselectRange(0, grid.getView().getRows().length - 1);
}
},{
text: "反选",
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
for(var i = grid.getView().getRows().length - 1; i >= 0; i --){
if(rsm.isSelected(i)){
rsm.deselectRow(i);
}else{
rsm.selectRow(i, true);//必须保留原来的,否则效果无法实现
}
}
}
}]
});

4 删除某行:
   {
text: "删除选定行",
icon: "../extjs/resources/images/default/dd/drop-no.gif",
cls: "x-btn-text-icon",
handler: function(){
var rsm = grid.getSelectionModel();//得到行选择模型
var view = grid.getView();
var store = grid.getStore();
for(var i = view.getRows().length - 1; i >= 0 ; i --){
if(rsm.isSelected(i)){
store.remove(store.getAt(i));
}
}
view.refresh();
}
}

5 删除所有行:
  var store = grid.getStore();
var view = grid.getView();
store.removeAll();
view.refresh();


6 grid中,在单元格中显示文字,图等
  var cm = new Ext.grid.ColumnModel([
        {header:'产品编号',dataIndex:'product_id'},
        {header:'产品名称',dataIndex:'product_name'},
        {header:'产品价格',dataIndex:'product_price',renderer:renderColor}
    ]);

    function renderColor(value)
    {
if(value >= 1000)
{
return "<span style='color:red;font-weight:bold'>" + value + "</span>";
}
else
{
return "<span style='color:blue'>" + value + "</span>";
}
    }

  如果获得单元格更详细信息:
    var cm = new Ext.grid.ColumnModel([
        {header:'产品编号',dataIndex:'product_id'},
        {header:'产品名称',dataIndex:'product_name'},
        {header:'产品价格',dataIndex:'product_price'},
        {header:'详细信息',dataIndex:'msg',width:130, renderer:renderMsg}
    ]);
    function renderMsg(value, cellmeta, record, rowIndex, columnIndex, store)
    {
       
return "<input type='button' value='显示详细信息' onclick='alert(\"" +
"产品名称:" + record.get('product_name') + "\\n" +
"当前行:" + rowIndex + "\\n" +
"当前列:" + columnIndex + "\\n" +
"当前单元格的css:" + cellmeta.css +
"\")'/>";
    }


7 复选框加上JAVASCRIPT判断全选等
   <script type="text/javascript">
var gridPanel;
var sm;
var cm;
var store;
Ext.onReady(function(){

    sm = new Ext.grid.CheckboxSelectionModel();
    cm = new Ext.grid.ColumnModel([
sm,
        {header:'产品编号',dataIndex:'product_id'},
        {header:'产品名称',dataIndex:'product_name'},
        {header:'产品价格',dataIndex:'product_price'}
    ]);
    var data = [
        ['01','自行车','320'],
        ['02','电脑','3500'],
        ['03','手机','1200'],
        ['04','衬衫','238'],
        ['05','羽绒服','658']
    ];

    store = new Ext.data.Store({
        proxy: new Ext.data.MemoryProxy(data),
        reader: new Ext.data.ArrayReader({}, [
            {name: 'product_id'},
            {name: 'product_name'},
            {name: 'product_price'}
        ])
    });
    store.load();


    gridPanel = new Ext.grid.GridPanel({
        autoHeight: true,
        renderTo: 'grid',       
        store: store,
        cm: cm,
        sm: sm
    });

});
function deleteCheckedRow()
{
for ( var i = store.getCount(); i >= 0 ; i--) {
if (sm.isSelected(i))
store.removeAt(i);
}
   
    gridPanel.reconfigure(store,
    cm);
}
        </script> 


8 表格分页:
    A 简单分页
      var gridPanel = new Ext.grid.GridPanel({
        renderTo: 'grid',
        autoHeight: true,
        store: store,
        cm: cm,
        bbar: new Ext.PagingToolbar({          
            pageSize: 20,
            store: store,       
            displayInfo: true,
            displayMsg: '显示记录 {0} - {1} of {2}',
            emptyMsg: "没有记录"
        })
    });
    store.load();
//如果用tbar,则会显示在顶部,工具条
B 服务端的分页原理:
   1)后端构建json的分页串,比如:
      String start = request.getParameter("start");
String limit = request.getParameter("limit");

int index = Integer.parseInt(start);
int pageSize = Integer.parseInt(limit);
int total = 100000;
String jsonStr = "{total:" + total + ",root:[";
for (int i = index; i < pageSize + index; i++)
{
int productIndex = i + 1;
jsonStr += "{product_id:" + productIndex + ",product_name:'产品"
+ productIndex + "',product_price:'价格" + productIndex
+ "'}";
if (i != pageSize + index - 1)
jsonStr += ",";
}
jsonStr += "]}";
out.println(jsonStr);
然后STORE中解析:
    var store = new Ext.data.Store({
                                  proxy: new Ext.data.HttpProxy({url:'PaginationDataServlet'}),
                                      reader: new Ext.data.JsonReader({
                                          totalProperty: 'total',
                                          root: 'root'
                                      }, [
                                          {name: 'product_id'},
                                          {name: 'product_name'},
                                          {name: 'product_price'}
                                      ])
                                  });
                                 store.load({params:{start:0,limit:10}});



9 可编辑的表格
      var gridPanel = new Ext.grid.EditorGridPanel({
                autoHeight: true,
                renderTo: 'grid',       
                store: store,
                cm: cm
               clicksToEdit;1,//如果要单击单元格就显示文本框
        var cm = new Ext.grid.ColumnModel([
                                       {header:'产品编号',dataIndex:'product_id'},
                                       {header:'产品名称',dataIndex:'product_name',editor:new Ext.grid.GridEditor(new Ext.form.TextField({
                                           allowBlank: false
                                       }))},
                                       {header:'产品价格',dataIndex:'product_price',editor:new Ext.grid.GridEditor(new Ext.form.TextField({
                                           allowBlank: false
                                       }))}
                                   ]);
10 在表格中添加新行
    首先是所有列上都要指定 Ext.grid.GridEditor对象:
     var gridPanel = new Ext.grid.EditorGridPanel({
        autoHeight: true,
        renderTo: 'grid',
        store: store,
        cm: cm,
        tbar: new Ext.Toolbar(['-', {
            text: '添加一行',
            handler: function(){
                var record = new Ext.data.Record({
                product_id:'',
                product_name:'',
                product_price:''
                });
                gridPanel.stopEditing();               
                store.insert(store.getCount(),record);
                gridPanel.startEditing(store.getCount()-1,0);
            }
        }, '-', {
            text: '删除一行',
            handler: function(){
                Ext.Msg.confirm('信息', '是否删除当前记录?', function(btn){
                    if (btn == 'yes') {
                        var sm = gridPanel.getSelectionModel();
                        var cell = sm.getSelectedCell();

                        var record = store.getAt(cell[0]);
                        store.remove(record);
                    }
                });
            }
        }, '-'])
    });
   注意,是用"-"表示在工具栏中添加一条竖线,保存数据时,通过slice类,获得添加
  text: '保存',
            handler: function(){
                var m = store.modified.slice(0);
                var data = [];
                Ext.each(m, function(item) {
                    data.push(item.data);
                });
                alert(Ext.encode(data));
                Ext.lib.Ajax.request(
                    'POST',
                    'SaveData',
                    {success: function(response){
                        Ext.Msg.alert('信息', response.responseText, function(){
                            store.reload();
                        });
                    }},
                    'row=' + encodeURIComponent(Ext.encode(data))
                );
            }
        },'-'])
     会用ext.encode方法把数组转为JSON格式的数据


11 表格分组
      var store = new Ext.data.GroupingStore({
        reader: reader,
        data: data,
        groupField: 'sex',
        sortInfo: {field: 'name', direction: "ASC"}
    });
    
    groupField指定了用什么字段进行分组,sortInFO用什么字段来排序:
  var grid = new Ext.grid.GridPanel({
        autoHeight: true,
        store: store,
        columns: columns,
        view: new Ext.grid.GroupingView(),
        renderTo: 'grid'
    });

12
  相关解决方案