ExtJS4 組件化編程,動態(tài)加載,面向對象,Direct
更新時間:2011年05月12日 23:14:25 作者:
ExtJS4終于出了正式版,體驗一下面官方推薦的向對象編程最佳實踐
過去的做法是new對象或者Ext.create一個對象,每個對象都要先實例化才能使用
ExtJS4推薦定義類的時候均使用Ext.define,利用xtype動態(tài)加載
修改了以前的一個登陸窗口,感覺用官方推薦的方法還是很不錯的
但還有一些問題沒有想得非常清楚,先把代碼貼出來一起研究下。請看代碼中的注釋~~
使用Ext+.Net,用Direct模式傳遞數據
Default.aspx:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ExtJS學習</title>
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="css/application.css" />
<script src="ext/ext-all.js" type="text/javascript"></script>
<script src="ext/ext-lang-zh_CN.js" type="text/javascript"></script>
<script type="text/javascript" src="ChcekLogin.ashx"></script>
<script src="js/Ext.app.LoginFormPanel.js" type="text/javascript"></script>
<script type="text/javascript" src="js/Ext.app.LoginDialog.js"></script>
</head>
<body>
<div id="loading-mask"></div>
<div id="loading">
<div class="loading-indicator"><img alt="" src="ext/resources/themes/images/default/shared/large-loading.gif" width="32" height="32" style="margin-right:8px;" align="absmiddle"/>正在加載...</div>
</div>
<script type="text/javascript">
//Ext.Loader.setConfig({ enabled: true });
Ext.onReady(function () {
Ext.BLANK_IMAGE_URL = 'img/s.gif';
Ext.QuickTips.init();
Ext.Msg.minWidth = 300;
//驗證提示信息顯示位置
Ext.form.Field.prototype.msgTarget = 'side';
//如果是繼承Ext.container.Viewport的實例,直接new出來就可以,會自動渲染到body
//本例中Ext.app.LoginDialog繼承自Ext.Window,需要調用show()方法才能顯示
new Ext.app.LoginDialog().show();
//250毫秒后刪除加載提示信息
setTimeout(function () {
Ext.get('loading').remove();
Ext.get('loading-mask').fadeOut({ remove: true });
}, 250);
})//onReady
</script>
</body>
</html>
Ext.app.LoginDialog.js
//LoginDialog類,繼承Ext.Window,上層對象使用new Ext.app.LoginDialog().show()動態(tài)實例化并顯示。
Ext.define('Ext.app.LoginDialog',{
extend:'Ext.Window',
title: '登陸',
plain: true,
closable: false,
closeAction: 'hide',
width: 400,
height: 300,
layout: 'fit',
border: false,
modal: true,
//使用xtype: 'LoginFormPanel'動態(tài)實例化Ext.app.LoginFormPanel,并使用api參數指定load和submit的服務器端方法。本例中只有submit
items: {itemId: 'loginFormPanel',xtype: 'LoginFormPanel',api: {submit: MyApp.ChcekLogin.Check}}
});
Ext.app.LoginFormPanel.js
//指定遠程調用的Provider,注意不能在initComponent中指定,因為config屬性設置是在initComponent之前,會報api找不到錯誤
Ext.direct.Manager.addProvider(Ext.app.REMOTING_API);
//loginForm類,繼承Ext.form.FormPanel,使用alias注冊至ComponentMgr,上層對象使用xtype:LoginFormPanel動態(tài)實例化。
//form的submit()方法使用Direct提交,上層對象實例化本類的時候使用config中的api屬性指定服務器端方法。
//很奇怪的是不能在Ext.define或者Ext.apply中指定api屬性,指定了實例化之后也會丟失,然后報url參數沒有的錯誤,只能在上層對象實例化本類得時候使用config中的api屬性指定api
//如果在這里使用原始的new方法指定api也可以,是ext4中的問題?有誰知道的發(fā)mail告訴我,萬分感謝~~
//使用Ext.define定義本類,定義中使用initComponent指定實例化之前需要執(zhí)行的操作。
//按面向對象編程思想,本類不調用任何上層對象,方法中不指定scope: this
Ext.define('Ext.app.LoginFormPanel',{
extend:'Ext.form.FormPanel',
initComponent: function(){
//初始化部分需要完成的功能
//alert("Ext.form.FormPanel 開始加載……");
//貌似Ext.apply得來的屬性和在Ext.define中定義的沒什么區(qū)別,為什么要用這個呢?誰來教教我?
Ext.apply(this, {
//labelAlign: 'left'
});
this.callParent();
},
alias:'widget.LoginFormPanel',
labelAlign: 'left',
buttonAlign: 'center',
bodyStyle: 'padding:5px',
frame: true, labelWidth: 80,
items: [
{ xtype: 'textfield', name: 'txt1', fieldLabel: '用戶名稱',
allowBlank: false, anchor: '90%', enableKeyEvents: true,
listeners: {
keypress: function (field, e) {
if (e.getKey() == 13) {
this.nextSibling().focus();
}
} //keypress
}
},
{ xtype: 'textfield', inputType: 'password', name: 'txt2', fieldLabel: '用戶密碼',
allowBlank: false, anchor: '90%', enableKeyEvents: true,
listeners: {
keypress: function (field, e) {
if (e.getKey() == 13) {
this.nextSibling().focus();
}
} //keypress
}
},
{ xtype: 'textfield', name: 'txt3', fieldLabel: '驗證碼',
allowBlank: false, anchor: '90%', mixLength: 6, maxLength: 6, enableKeyEvents: true,
listeners: {
keypress: function (field, e) {
if (e.getKey() == 13) {
this.ownerCt.submit();
}
} //keypress
}
},
{ xtype: 'panel', height: 100, html: '<div style="margin:5px 0px 0px 84px"><a href="#"><img alt="如果看不清楚請單擊圖片更換圖片。" onclick="this.src=\'vcode.ashx?d=\'+new Date();" id="code" height="82" width="242" src="vcode.ashx" border="0"></a></div>', border: false },
{ xtype: 'panel', height: 30, html: '<div style="margin:5px 0px 0px 84px;color:red">*如果圖片不清晰請單擊圖片更換圖片</div>', border: false }
], //items
buttons: [
{ text: '確定', handler: function () { this.findParentByType('LoginFormPanel').submit(); }},
//面向本對象編程,這里不要加入 scope: this,否則function會指定到window上面
{ text: '重置', handler: function () { this.findParentByType('LoginFormPanel').form.reset(); } }
],
submit: function () {
if (this.getForm().isValid()) {
this.getForm().submit({
success: function (form, action) {
window.location = "main.htm";
},
failure: function (form, action) {
//使用form參數訪問原submit的form
form.reset();
//使用action.result訪問結果集
Ext.MessageBox.alert('登陸失敗', action.result.data);
}
})
}
}
});
過程已經寫到注釋里面了,有什么問題請在下面討論
修改了以前的一個登陸窗口,感覺用官方推薦的方法還是很不錯的
但還有一些問題沒有想得非常清楚,先把代碼貼出來一起研究下。請看代碼中的注釋~~
使用Ext+.Net,用Direct模式傳遞數據
Default.aspx:
復制代碼 代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ExtJS學習</title>
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="css/application.css" />
<script src="ext/ext-all.js" type="text/javascript"></script>
<script src="ext/ext-lang-zh_CN.js" type="text/javascript"></script>
<script type="text/javascript" src="ChcekLogin.ashx"></script>
<script src="js/Ext.app.LoginFormPanel.js" type="text/javascript"></script>
<script type="text/javascript" src="js/Ext.app.LoginDialog.js"></script>
</head>
<body>
<div id="loading-mask"></div>
<div id="loading">
<div class="loading-indicator"><img alt="" src="ext/resources/themes/images/default/shared/large-loading.gif" width="32" height="32" style="margin-right:8px;" align="absmiddle"/>正在加載...</div>
</div>
<script type="text/javascript">
//Ext.Loader.setConfig({ enabled: true });
Ext.onReady(function () {
Ext.BLANK_IMAGE_URL = 'img/s.gif';
Ext.QuickTips.init();
Ext.Msg.minWidth = 300;
//驗證提示信息顯示位置
Ext.form.Field.prototype.msgTarget = 'side';
//如果是繼承Ext.container.Viewport的實例,直接new出來就可以,會自動渲染到body
//本例中Ext.app.LoginDialog繼承自Ext.Window,需要調用show()方法才能顯示
new Ext.app.LoginDialog().show();
//250毫秒后刪除加載提示信息
setTimeout(function () {
Ext.get('loading').remove();
Ext.get('loading-mask').fadeOut({ remove: true });
}, 250);
})//onReady
</script>
</body>
</html>
Ext.app.LoginDialog.js
復制代碼 代碼如下:
//LoginDialog類,繼承Ext.Window,上層對象使用new Ext.app.LoginDialog().show()動態(tài)實例化并顯示。
Ext.define('Ext.app.LoginDialog',{
extend:'Ext.Window',
title: '登陸',
plain: true,
closable: false,
closeAction: 'hide',
width: 400,
height: 300,
layout: 'fit',
border: false,
modal: true,
//使用xtype: 'LoginFormPanel'動態(tài)實例化Ext.app.LoginFormPanel,并使用api參數指定load和submit的服務器端方法。本例中只有submit
items: {itemId: 'loginFormPanel',xtype: 'LoginFormPanel',api: {submit: MyApp.ChcekLogin.Check}}
});
Ext.app.LoginFormPanel.js
復制代碼 代碼如下:
//指定遠程調用的Provider,注意不能在initComponent中指定,因為config屬性設置是在initComponent之前,會報api找不到錯誤
Ext.direct.Manager.addProvider(Ext.app.REMOTING_API);
//loginForm類,繼承Ext.form.FormPanel,使用alias注冊至ComponentMgr,上層對象使用xtype:LoginFormPanel動態(tài)實例化。
//form的submit()方法使用Direct提交,上層對象實例化本類的時候使用config中的api屬性指定服務器端方法。
//很奇怪的是不能在Ext.define或者Ext.apply中指定api屬性,指定了實例化之后也會丟失,然后報url參數沒有的錯誤,只能在上層對象實例化本類得時候使用config中的api屬性指定api
//如果在這里使用原始的new方法指定api也可以,是ext4中的問題?有誰知道的發(fā)mail告訴我,萬分感謝~~
//使用Ext.define定義本類,定義中使用initComponent指定實例化之前需要執(zhí)行的操作。
//按面向對象編程思想,本類不調用任何上層對象,方法中不指定scope: this
Ext.define('Ext.app.LoginFormPanel',{
extend:'Ext.form.FormPanel',
initComponent: function(){
//初始化部分需要完成的功能
//alert("Ext.form.FormPanel 開始加載……");
//貌似Ext.apply得來的屬性和在Ext.define中定義的沒什么區(qū)別,為什么要用這個呢?誰來教教我?
Ext.apply(this, {
//labelAlign: 'left'
});
this.callParent();
},
alias:'widget.LoginFormPanel',
labelAlign: 'left',
buttonAlign: 'center',
bodyStyle: 'padding:5px',
frame: true, labelWidth: 80,
items: [
{ xtype: 'textfield', name: 'txt1', fieldLabel: '用戶名稱',
allowBlank: false, anchor: '90%', enableKeyEvents: true,
listeners: {
keypress: function (field, e) {
if (e.getKey() == 13) {
this.nextSibling().focus();
}
} //keypress
}
},
{ xtype: 'textfield', inputType: 'password', name: 'txt2', fieldLabel: '用戶密碼',
allowBlank: false, anchor: '90%', enableKeyEvents: true,
listeners: {
keypress: function (field, e) {
if (e.getKey() == 13) {
this.nextSibling().focus();
}
} //keypress
}
},
{ xtype: 'textfield', name: 'txt3', fieldLabel: '驗證碼',
allowBlank: false, anchor: '90%', mixLength: 6, maxLength: 6, enableKeyEvents: true,
listeners: {
keypress: function (field, e) {
if (e.getKey() == 13) {
this.ownerCt.submit();
}
} //keypress
}
},
{ xtype: 'panel', height: 100, html: '<div style="margin:5px 0px 0px 84px"><a href="#"><img alt="如果看不清楚請單擊圖片更換圖片。" onclick="this.src=\'vcode.ashx?d=\'+new Date();" id="code" height="82" width="242" src="vcode.ashx" border="0"></a></div>', border: false },
{ xtype: 'panel', height: 30, html: '<div style="margin:5px 0px 0px 84px;color:red">*如果圖片不清晰請單擊圖片更換圖片</div>', border: false }
], //items
buttons: [
{ text: '確定', handler: function () { this.findParentByType('LoginFormPanel').submit(); }},
//面向本對象編程,這里不要加入 scope: this,否則function會指定到window上面
{ text: '重置', handler: function () { this.findParentByType('LoginFormPanel').form.reset(); } }
],
submit: function () {
if (this.getForm().isValid()) {
this.getForm().submit({
success: function (form, action) {
window.location = "main.htm";
},
failure: function (form, action) {
//使用form參數訪問原submit的form
form.reset();
//使用action.result訪問結果集
Ext.MessageBox.alert('登陸失敗', action.result.data);
}
})
}
}
});
過程已經寫到注釋里面了,有什么問題請在下面討論
相關文章
javascript Ext JS 狀態(tài)默認存儲時間
通過ExtJS的源碼可以知道,ExtJS將Grid的自定義顯示列等自定義狀態(tài)信息存入Cookie中,默認時間為7天2009-02-02ExtJS4 動態(tài)生成的grid導出為excel示例
解決了一個表格不能重復下載的小BUG,一個使用grid初始化發(fā)生的BUG,需要的朋友可以參考下2014-05-05extjs3 combobox取value和text案例詳解
使用combobox時,它有一個hiddenName的屬性,專門用于提交combobox中value的值,接下來介紹extjs3 combobox如何取value和text值,感興趣的朋友可以不要錯過了啊2013-02-02ExtJS Grid使用SimpleStore、多選框的方法
ExtJS 中Grid使用SimpleStore、多選框的方法,需要的朋友可以參考下。2009-11-11extjs關于treePanel+chekBox全部選中以及清空選中問題探討
treePanel+chekBox全部選中以及清空選中,想必大家在學習使用過程中都見過這種效果吧,接下來為大家詳細介紹下實現過程及細節(jié),感興趣的朋友可以參考下哈2013-04-04ExtJS4 Grid改變單元格背景顏色及Column render學習
利用的是Column的render實現單元格背景顏色改變,本文給予了實現代碼,感興趣的朋友可以了解下,或許對你學習ExtJS4 Grid有所幫助2013-02-02Extjs TriggerField在彈出窗口顯示不出問題的解決方法
解決Extjs TriggerField在彈出窗口顯示不出問題2010-01-01