ExtJs4入门之七: Grid组件示例的MVC重构


文件结构图



一:Model层

1.model

//模型类(自定义的类 都不能放在Ext.onReady()中,且js文件名和类名必须都是小写 )
Ext.define("RT.model.user" ,{
	extend : "Ext.data.Model",
	fields:[
			{ name : "userId" , type : "int" , sortable : true },
	        { name : "name" , type : "string" , sortable : true },
	        { name : "age" , type : "int" , sortable : true },
	        { name : "male" , type : "string" , sortable : true }
	]
});

2.store

	//数据集合
	Ext.define("RT.store.userstore",{
		extend:"Ext.data.Store",
		model :"RT.model.user",
		//storeId : "store",//创建id,供组件调用
		autoLoad:true,//不自动加载的话就拿不到数据
		proxy:{
			type : "ajax",
			url: "/ExtJs4_Demo/extDemo/gridApp/fakeData.jsp",
			reader:{
				type:"json",
				root:"users",
			},
			writer:{
				type:"json",
				
			}
		}
	})



二:View层

	//renderTo : "divId",//渲染的锚点
	//去掉handler:grid_delete

	//表格编辑插件 
	var cellEditor = Ext.create("Ext.grid.plugin.CellEditing",{
		clicksToEdit : 2
	});

	Ext.define("RT.view.usergrid",{
		extend:"Ext.grid.Panel",
		alias:"widget.usergrid",//别名
		width : 600,
		height: 300,
		frame : true,//面板边框
		forceFit : true,//横行的拉抻
		//获取M层指定的数据集合
		store : "userstore",//这里是model层的入口.Ext.data.StoreManager.lookup("store_user"),
		//表头
		columns : [
		   {text:"userId" , dataIndex : "userId" ,width:"10%"},//dataIndex类会去寻找Store类或者对应Model中的键值
	       {text:"name" , dataIndex : "name" ,width:"30%" },
	       {text:"age" , dataIndex : "age" ,width:"30%",
	          	field:{xtype : "textfield", allowBlank:false}
	       },
	       {text:"male" , dataIndex : "male" ,width:"10%"}
		],
		tbar:[
			{ xtype:"button" , text:"添加" , iconCls:"table_add"},
			{ xtype:"button" , text:"删除" ,id:"del"},//去掉handler:grid_delete
			{ xtype:"button" , text:"修改" },
			{ xtype:"button" , text:"刷新" },
		],
		//组件集
		dockedItems:[
				//分页组件要和store挂钩, 否则是灰色的
			{ xtype:"pagingtoolbar" , dock:"bottom" , displayInfo:true,  store:"userstore"}
		],
		//选择方式, 还有rowmodel,cellmodel什么的
		selType:'checkboxmodel',
		//多选框
		multiSelect:true,
		//可编辑的plugin插件
		plugins:[
			cellEditor
		],
		//初始化
		initComponent:function(){
			this.callParent(arguments);
		}
	});
	



三:Controller层

	Ext.define("RT.controller.userController",{
		extend:"Ext.app.Controller",
		init:function(){
			this.control({
				"usergrid button[id=del]":{//选择器
					click:function(o){
						//alert(o.text);
						grid_delete(o)
					}
				}
			});
		},
		//==>实践证明以下名字必须全小写,像"userGrid"这类驼峰的名字ext找不到对应的js文件
		views:[
			"usergrid"//v层的名字
		],
		stores:[
			"userstore"//m层的名字
		],
		models:[
			"user"
		]

	});


	//操作函数
	function grid_delete(btnObj)
	{
		//alert("==>grid_delete()"+btnObj.text);
		//按钮对象的父对象是工具条, 再父级才是所属表格
		var gird = btnObj.ownerCt.ownerCt;
		var dataArray = gird.getSelectionModel().getSelection();
		if( 0 == dataArray.length )
		{
			Ext.Msg.alert("提示","至少要选择一条数据");
		}
		else
		{
			var ids = [];
			$.each(dataArray , function(i,model){
				//alert( model.get("name") );//model.data.name
				ids.push( model.get("userId") );
			});
			
			Ext.Ajax.request({  
		        url:"/ExtJs4_Demo/extDemo/gridApp/fakeData.jsp",
		        params:{'ids':ids},  
		        method:"POST",  
		        timeout:3000,//请求超时时间3秒   
		        success:function( response , options){  
		            //alert("==>成功" + response.responseText +"__" + options);  
		        	var store = gird.getStore();
		        	//成功后删除数据 , 还从dataArray拿值
		        	$.each(dataArray , function(i,model){
						store.remove(model);//store类的删除一个model
					});
		        },  
		        failure:function( response , options){  
		            alert("==>失败" + response.responseText +"__" + options);  
		        }  
		    });  
		}//end if else	
	}//end of function



四:程序入口 app.js

1.jsp

<!-- 1.jQuery -->
<script type="text/javascript" src="<%=basePath %>js/jquery-1.7.1.min.js"></script>
<!-- 2.Ext -->
<link rel="stylesheet" type="text/css" href="<%=basePath %>js/extjs/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="<%=basePath %>extDemo/gridApp/view/images.css" />
<script type="text/javascript" src="<%=basePath %>js/extjs/ext-all-debug.js"></script>
<script type="text/javascript" src="<%=basePath %>js/extjs/locale/ext-lang-zh_CN.js"></script>
<!-- 3.OthersJs -->
<script type="text/javascript" src="<%=basePath %>extDemo/gridApp/gridApp.js"></script> 

2.app.js

//只有app.js在Ext.onReady()内部
Ext.onReady( function(){

	
	//异步加载 , 其他Js声明对象 , app中实例化
	Ext.Loader.setConfig({
		enabled:true
	});
	
	Ext.QuickTips.init();
	
	Ext.application({
		name : "RT",//命名空间
		appFolder : "/ExtJs4_Demo/extDemo/gridApp",//根目录地址 
		launch : function(){ //回调函数
			Ext.create("Ext.container.Viewport",{//把表格扔到Viewport中显示
				layout : "auto", //布局
				items :[
					{ 	//Viewport中元素的配置
						xtype:"usergrid",
						title:"用户表格" ,
						//html:"用户表格测试内容"
					}
				]
			});
		},
		//==>controller的入口,ext会去appFolder/controller中找你指定的文件
		controllers:[
			"userController"
		]
	});
	
})


Ext的程序不太好调, 换个结构我弄了一晚上... 遇上几个问题让人很郁闷:

1.如果程序的netWork里GET404,就把文件名和类名换成纯小写

2.如果ext-all-debug.js报什么subString错误, 检查类名和controller中的配置, 都换成纯小写

3.加载js文件成功, 可是自定义类没起作用, 还是检查大小写

程序找到文件之后 ,在报错就比较准确了,除了大小写 根据行号和提示修修改改就行了









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值