Posted on 2009-07-17 23:31
月下孤城 閱讀(2382)
評(píng)論(6) 編輯 收藏 所屬分類:
extjs
近期一個(gè)項(xiàng)目前臺(tái)采用了extjs框架,經(jīng)過一段時(shí)間的編碼,對(duì)extjs面向?qū)ο笠灿辛艘欢ǖ牧私狻R韵峦ㄟ^FormPanel擴(kuò)展對(duì)表單對(duì)象中常用代碼段進(jìn)行了通用提取,并以此實(shí)踐ext面向?qū)ο蟮睦^承,希望對(duì)剛接觸的朋友有所幫助。
1.實(shí)現(xiàn)類構(gòu)造方法:
1
/**//*
2
* 默認(rèn)表單類
3
* add by daiqiang
4
* */
5
Ext.ux.DefaultFormPanel = function(config){
6
/*FormPanel submit按鈕url*/
7
this.subBtnUrl = config.subBtnUrl;
8
/*submit按鈕url提交參數(shù)*/
9
this.subBtnParams = config.subBtnParams?config.subBtnParams:
{};
10
/*submit提交完成后回調(diào)方法*/
11
this.subBtnCallbackFun = config.subBtnCallbackFun;
12
/*submit 顯示文本*/
13
this.subBtnText = config.subBtnText? config.subBtnText:'保存';
14
/*
15
* 重置按鈕定制方法
16
* 【主要針對(duì)表單狀態(tài)為'修改'(非'新增')時(shí),
17
* 提交表單數(shù)據(jù)可能含隱藏字段,
18
* 若用reset方法將把隱藏字段值也一并清掉。
19
* 考慮這種情況需自定義表單重置方法】
20
* */
21
this.resetBtnFun = config.resetBtnFun;
22
23
Ext.ux.DefaultFormPanel.superclass.constructor.call(this, config);
24
}
實(shí)現(xiàn)類構(gòu)造方法中先初始化屬性變量,然后調(diào)用繼承類的構(gòu)造方法,實(shí)現(xiàn)構(gòu)造方法的繼承擴(kuò)展。
2.使用Ext.extend方式實(shí)現(xiàn)父類方法、屬性的繼承擴(kuò)展.
1
Ext.extend(Ext.ux.DefaultFormPanel,Ext.form.FormPanel,
{
2
frame:true,
3
defaultType: 'textfield',
4
labelAlign:'right',
5
bodyStyle:'padding:5px 5px 0',
6
layout : 'form',
7
buttonAlign : 'center',
8
autoHeight:true,
9
initComponent:function(){
10
/*初始化提交、重置按鈕*/
11
var oprBtns = [
12
{
13
text :this.subBtnText,
14
id:'subFormBtn',
15
handler :function(){
16
this.getForm().submit({
17
url:this.subBtnUrl,
18
params:this.subBtnParams,
19
clientValidation: true,
21
method:'post',
22
success:function(form, action){
23
// Ext.Msg.alert("Success", action.result.msg);
24
Ext.Msg.alert("信息", action.result.msg);
25
//執(zhí)行回調(diào)函數(shù)
26
if(this.subBtnCallbackFun){
27
this.subBtnCallbackFun(this);
28
};
29
}.createDelegate(this),
30
failure: function(form, action){
31
switch (action.failureType){
32
case Ext.form.Action.CLIENT_INVALID:
33
// Ext.Msg.alert("Failure", "Form fields may not be submitted with invalid values");
34
Ext.Msg.alert("錯(cuò)誤", "提交的表單數(shù)據(jù)無效,請(qǐng)檢查!");
35
break;
36
case Ext.form.Action.CONNECT_FAILURE:
37
// Ext.Msg.alert("Failure", "Ajax communication failed");
38
Ext.Msg.alert("錯(cuò)誤", "服務(wù)器連接失敗,請(qǐng)稍后再試!");
39
break;
40
case Ext.form.Action.SERVER_INVALID:
41
// Ext.Msg.alert("Failure", action.result.msg);
42
Ext.Msg.alert("錯(cuò)誤", action.result.msg);
43
}
44
}.createDelegate(this)
45
});
46
}.createDelegate(this)
47
},
48
{
49
text:'重置',
50
id:'resetFormBtn',
51
handler:function(){
52
if(this.resetBtnFun){
53
this.resetBtnkFun(this);
54
}else{
55
this.getForm().reset();
56
}
57
}.createDelegate(this)
58
}
59
];
60
61
if(this.buttons){
62
for(var i=0;i<oprBtns.length;i++){
63
this.buttons.push(oprBtns[i]);
64
}
65
}else{
66
this.buttons = oprBtns;
67
}
68
69
Ext.ux.DefaultFormPanel.superclass.initComponent.apply(this, arguments);
70
}
71
})
Ext.
extend(
Function subclass
,
Function superclass
,
[Object overrides
] ),參數(shù)分別對(duì)應(yīng)'子類對(duì)象','父類對(duì)象','覆蓋擴(kuò)展父類方法屬性'。
2-8行是對(duì)FormPanel的默認(rèn)設(shè)置。接下來就是對(duì)ext 組件方法initComponent的覆蓋實(shí)現(xiàn)(
了解ext組件生命周期詳情點(diǎn)這里),該方法中主要實(shí)現(xiàn)默認(rèn)的提交、重置
按鈕操作。注意在29行代碼success屬性方法后加了個(gè)createDelegate(this)方法,這主要是success方法中引用了類屬性this.subBtnCallbackFun,而success方法中的scope(域)
和當(dāng)前類的scope不同,故通過
Function類中的
createDelegate轉(zhuǎn)化到當(dāng)前域中。處理完自定義操作后別望了回調(diào)父類該方法,完成FormPanel的初始化工作。
3.調(diào)用代碼片段
代碼執(zhí)行后會(huì)彈出一個(gè)包含'新增','重置'按鈕表單的窗口.點(diǎn)擊新增按鈕后會(huì)執(zhí)行一系列流程:表單效驗(yàn)通過->發(fā)送subBtnUrl到后臺(tái)接受數(shù)據(jù)->后臺(tái)數(shù)據(jù)接受調(diào)用回調(diào)方法,最后alert('回調(diào)方法');提示一個(gè)表單新增操作完成。
---------------------
月下孤城
mail:eagle_daiqiang@sina.com