1. 程式人生 > >ExtJs學習(六)~~入門實戰

ExtJs學習(六)~~入門實戰

一、開發一個“玩家資訊”的功能~~ 效果圖

【思路分析:】

這裡需要一個grid元件去展示資料,grid元件需要一個columns陣列顯示返回結果,同時grid需要一個store,store需要一個model。同時grid也需要一個toolbar和queryForm。Grid表格是放在主視圖裡面的。這裡一共就有8個元件。

我們約定好,除了storemain Viewcreate,其他元件都採用define模式。個人習慣吧。

二、整理開發過程

需要元件推導過程如上,但是開發時反過來操作:

first:Model -- 提供模板,只需要改欄位+型別,根據JAVA的實體。

seconde:Store -- 只需要修改

url、跟model即可。若後臺無完成,先寫靜態資料,讓表格資料顯示出來即可。

third: columns -- 因為顯示的列比較多,這裡把columns單獨成一個數組來寫。只需要修改表頭。render對返回的值進行自定義輸出。

four: toolbar – 幾乎每一個功能都會附帶一個查詢框。這裡先寫好該queryForm元件。修改表單的name值跟欄位名即可。

Five: grid – 修改columns+store+toolbar名。將所有元件放到grid即可。

six: main view  -- 主檢視在onReady裡面,載入grid主鍵即可。

Seven: function – 根據你的業務需求寫 所有的事件函式

三、開發程式碼 ~~ 以下采用MVC分層的開發模式。

first:Model

/*-----------------------------1. model start-------------------------*/
Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        { name : 'channel', type : 'string' },
        { name : 'channel_name', type : 'string' },
        { name: 'id',type:'long'},
        { name: 'createDate',type:'string'}

    ]
});
/*-----------------------------model end-------------------------*/

seconde:Store

/*-----------------------------2.store star-------------------------*/

var simpsonsStore = Ext.create('Ext.data.Store', {
    model: 'User', //這裡的Model直接引用上面定義的MODEL
    pageSize: 1000,
    storeId:'simpsonsStore',
    remoteSort : true,
   /* data : [
        {channel: '管道一',    channel_name: '騰訊', id: 1001,    createDate: '2018-08-06 09:04:04'},
        {channel: '管道二',    channel_name: 'IOS', id: 1002,    createDate: '2018-08-06 09:04:04'},
        {channel: '管道三',    channel_name: '百度', id: 1003,    createDate: '2018-08-06 09:04:04'},
        {channel: '管道四',    channel_name: '測試管道', id: 1004,    createDate: '2018-08-06 09:04:04'},
    ]*/
    proxy: {
        type: 'ajax',
        actionMethods:'create',
        extraParams: {},
        url: project+'/game/UserInfo/roleDemo',
        reader: {
            type: 'json',
            root: 'data',
            totalProperty: 'count'
        }
    },
    pageSize: 14,
    autoLoad: true,
    remoteSort: true,//全域性排序
    sorters: {
        direction: 'ASC',
        property: 'id'
    }
});
/*-----------------------------store end-------------------------*/

third: columns

/*-----------------------------3.columns star-------------------------*/
var colunmArray=new Array(
    { text: '渠道',  dataIndex: 'channel' },
    { text: '渠道名稱',  dataIndex: 'channel_name',renderer:function(value,meta,record){
        return value+"("+record.data.channel+")";
    }},
    { text: '渠道ID',  dataIndex: 'id',
        renderer : function(value){
            if(value == 1001)
                return '騰訊1001';
            else if(value == 1002)
                return 'ios1002';
            else if(value == 1003)
                return '百度1003';
            else if(value == 1004)
                return '測試渠道1004';
            else
                return 'PC';
        }
    },
    {
        text: '建立時間', dataIndex: 'createDate'
    }
);
/*-----------------------------columns end-------------------------*/

four: toolbar

/*-----------------------------4.toolbar star-------------------------*/

/*
var xxxPanelForm1 = Ext.create('Ext.form.Panel',{
    id:'xxxPanelForm',
    layout: {
        type:'hbox',
        //控制元件橫向拉伸,寬度為最控制元件的寬
        /!*align:'stretchmax'*!/
    },

    border:'10 5 3 10',
    bodyPadding: 5,
    scrollable: false,
    defaults: {
        /!*labelWidth: 35,*!/
        labelSeparator: ':'
    },
    items: [{
        xtype: 'hidden',
        fieldLabel: 'Id',
        //allowBlank: false,
        name:'pid'
    },{
        xtype: 'combobox',
        fieldLabel: '等級1',
        labelWidth:40,
        matchFieldWidth:false,
        name:'level',
        width:150,
        store:  Ext.create('Ext.data.Store', {
            fields: ['value', 'name'],
            data : [
                {"value":"HIGH",   "name":"高"},
                {"value":"MEDIUM",  "name":"中"},
                {"value":"LOW",    "name":"低"}
            ]
        }),
        queryMode:       'local',
        displayField: 'name',
        valueField:   'value'
    },{
        xtype: 'textfield',
        fieldLabel: '商品編號',
        labelWidth:60,
        margin:'0 0 0 10',
        reference: 'productSearchForm-pnumber',
        name:'pnumber',

        //allowBlank : false,
    },{
        xtype: 'button',
        margin:'0 0 0 10',
        text: '查詢',
    }],
});
*/

Ext.define('Admin.view.myToolbar', {
    extend:'Ext.toolbar.Toolbar',
    id:"myfirstDefine",
    xtype: 'myfirstDefine',
    dock: 'top',
    autoScroll:true,
    items: [ {
        xtype: 'combobox',
        fieldLabel: '等級1',
        labelWidth:40,
        matchFieldWidth:false,
        name:'level',
        width:150,
        store:  Ext.create('Ext.data.Store', {
            fields: ['value', 'name'],
            data : [
                {"value":"HIGH",   "name":"高"},
                {"value":"MEDIUM",  "name":"中"},
                {"value":"LOW",    "name":"低"}
            ]
        }),
        queryMode:       'local',
        displayField: 'name',
        valueField:   'value'
    },{
        fieldLabel : '角色暱稱',
        labelWidth : 60,
        xtype : 'textfield',
        id : 'roleName',
        name :'roleName',
        // allowBlank : false, // 不能為空
        emptyText : '暱稱'
    },  "-", {
        fieldLabel : '手機號',
        labelWidth : 60,
        xtype : 'textfield',
        id : 'phone',
        name :'phone',
        emptyText : '手機號'
    }, "-", {
        fieldLabel : '裝置型號',
        labelWidth : 60,
        xtype : 'textfield',
        id : 'deviceModel',
        name :'deviceModel'
    }, {

        xtype     : 'button',
        text   :'查詢',
        handler: function() {
            fileSelect();
        }
    }]
});

/*-----------------------------toolbar end-------------------------*/

Five: grid

/*-----------------------------5.grid star-------------------------*/

Ext.define('Admin.view.product.ProductGrid', {
    extend: 'Ext.grid.Panel',
    xtype: 'productGrid',
    viewConfig:{
        enableTextSelection:true
    },
    id:'productGrid',
    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    //store:aaStore,
    columns: colunmArray,
    height: 400,
    bbar : new Ext.PagingToolbar({
        store : Ext.data.StoreManager.lookup('simpsonsStore'),
        displayInfo : true,
        displayMsg : '第 {0} - {1} 條  共 {2} 條 000',
        emptyMsg : "沒有記錄"
    }),
    dockedItems: [
        {xtype:"myfirstDefine"}
        //xxxPanelForm1
    ]
});


/*var roleInfoGrid=Ext.create('Ext.grid.Panel', {

    viewConfig:{
        enableTextSelection:true
    },
    id:'gridPanel',
    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    //store:aaStore,
    columns: colunmArray,
    height: 400,
    bbar : new Ext.PagingToolbar({
        store : Ext.data.StoreManager.lookup('simpsonsStore'),
        displayInfo : true,
        displayMsg : '第 {0} - {1} 條  共 {2} 條 ',
        emptyMsg : "沒有記錄"
    }),
    dockedItems: [
        xxxPanelForm1,{xtype:"myfirstDefine"}
    ]
});*/

/*-----------------------------grid end-------------------------*/

six: main view

/*-----------------------------6.main view  star-------------------------*/
Ext.onReady(function() {
    var roleUrl=project+"/report/roleInfo.jsp";
    var doUrl=project+"/report/speakForbidden.jsp";
    Ext.create('Ext.container.Viewport', {
        title:'角色帳號資訊',
        layout: {
            type: 'fit'
        },
        items: [
            //roleInfoGrid
            {xtype:'productGrid'}
        ]
    });

    if(window.parent.stealPage){
        Ext.getCmp("roleId").setValue(window.parent.tabRoleId);
        window.parent.tabRoleId=null;
        window.parent.stealPage=false;
        fileSelect();
    }

});
/*-----------------------------main view  end-------------------------*/

Seven: function

Ext.define('Admin.view.product.ProductViewController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.productViewController',
	productGridOpenAddWindow  : function(){
		//alert("新增商品的方法");
		//alert("新增商品的方法");
		var cfg = Ext.apply({
			xtype: 'productGridWindow'
			,items: [Ext.apply({xtype: 'productGridForm'})]
		},{
			title:'新增商品'//,width: 800//,height: 600
		});
		Ext.create(cfg);
	},
	
	productGridWindowClose:function(btn){
		//alert("關閉");
		var win = btn.up('window');
		if(win){
			win.close();
		}
	},
	productGridFormSubmit:function(btn){
		//alert("儲存");
		
		var productGridForm = btn.up('form').getForm();
		var win = btn.up('window');
		productGridForm.submit( { 
			//waitTitle : '請稍後...', 
			//waitMsg : '正在儲存訂單資訊,請稍後...', 
			url : 'product/saveOrUpdate', 
			method : 'post', 
			success : function(form, action) { 
				Ext.Msg.alert("提示",action.result.msg); 
				win.close();
				//必須SupplierGrid中增加對應id:'supplierGrid'屬性
				Ext.getCmp('productGrid').store.reload();			
				}, 
			failure : function(form, action) { 
				Ext.Msg.alert("提示",action.result.msg); 
				
			} 
        });
	},
	productGridDeleteDate:function(btn){
		//alert("11");
		var grid = btn.up('gridpanel');
		var selModel = grid.getSelectionModel();
        if (selModel.hasSelection()) {
            Ext.Msg.confirm("警告", "確定要刪除嗎?", function (button) {
                if (button == "yes") {
                    var selected = selModel.getSelection();
                    var selectIds = []; //要刪除的id
                    Ext.each(selected, function (record) {
						//alert(record.data.pid);
                        selectIds.push(record.data.pid);
                    })
					
                  	Ext.Ajax.request({ 
						url : 'product/deleteByIds', 
						method : 'post', 
						params : { 
							ids:selectIds
						}, 
						success: function(response, options) {
							Ext.getCmp('productGrid').store.reload();
                            var json = Ext.util.JSON.decode(response.responseText);
				            if(json.success){
				            	Ext.Msg.alert('操作成功', json.msg);
				                grid.getStore().reload();
					        }else{
					        	Ext.Msg.alert('操作失敗', json.msg);
					        }							
			            }
					});

                }
            });
		}else{
        	Ext.Msg.alert('提示',"請選擇一行資料進行刪除!");
        }
	},
	
	productGridOpenEditWindow:function(btn){
		//alert("xiugai");
		var grid = btn.up('gridpanel');//獲取Grid檢視
		var selModel = grid.getSelectionModel();//獲取Grid的SelectionModel
        if (selModel.hasSelection()) {//判斷是否選中記錄
           var record = selModel.getSelection()[0];//獲取選中的第一條記錄.
		   //alert(record);
		   //console.log(record);
           //建立修改window和form
		   var productGridWindow = Ext.widget('productGridWindow',{
				title:'修改商品',
				items: [{xtype: 'productGridForm'}]
			});
		   	//讓form載入選中記錄
           productGridWindow.down("form").getForm().loadRecord(record);
        }else{
        	Ext.Msg.alert('提示',"請選擇一行資料進行修改!");
        }
		
	},
	productSearchFormSubmit:function(btn){
		//alert("你好");
		var store = btn.up('gridpanel').getStore();
		
		//2.按照所選欄位進行查詢引數(條件)的擴充套件
	   var formValues=btn.up('form').getForm().getValues();
	  
	   //alert(formValues["pname"]);
	   //alert(formValues["pnumber"]);
	   //alert(formValues["level"]);
	   //alert(formValues["wname"]);
	   if (formValues["pname"]==''&&formValues["pnumber"]==''&&formValues["level"]=='' && formValues["wname"]=='') {		 
			 store.getProxy().extraParams ={ };
			 store.reload();			
	   }else{
		   //alert("失敗");
		   //1.清空所有查詢條件
			Ext.apply(store.proxy.extraParams, {
				pname:'',
				pnumber:'',
				level:'',
				wname:''
			}); 
			
			 Ext.apply(store.proxy.extraParams, {
					pname:this.lookupReference('productSearchForm-pname').getValue(),
					pnumber:this.lookupReference('productSearchForm-pnumber').getValue(),
					level:this.lookupReference('productSearchForm-level').getValue(),
					wname:this.lookupReference('productSearchForm-wname').getValue()						
				});  
			store.load({params: {start:0,limit:14,page:1}});
	   }
	},
	productGridExportXls:function(){
		//alert("商品匯出");
		window.location.href = "product/exportExcel";
	}
	
});

基於上面的七大元件即可快速開發一個模組。而且寫了自動生成model跟store的工具類,可以更快寫出一個模組。

如果說,你理解好上面七個元件的使用關係的話,那麼根據上面的理解,直接copy一份程式碼,直接改store、url即可