extjs 的某個panel在調用Ext.ajax時,回調成功,執行success指定的方法,這個方法的範圍會修改為最上層的網頁,導致回調方法不能通過this.items.get()找到對應的控制項,只能通過Ext.getCmp()從整個網頁尋找,這樣ID相同的控制項都會被修改。
在extjs 4之前,應該是通過委託來實現回呼函數範圍的變化,使用createDelegate方法。
在extjs 4.0.7 中, 通過Ext.Function.bind來修改回呼函數的範圍
bind( Function fn, [Object scope], [Array args], [Boolean/Number appendArgs] ) : Function
1 /*
2 request : 傳入參數
3 successCallback : 後台執行成功後,執行的回調方法
4 failureCallback : 後台執行失敗後,執行的回調方法
5 caller : 調用AccessData方法的表單,通過這個參數,可以在回調方法中訪問調用表單中的變數
6 在調用這個方法時,如果前面的參數不需要,但需要後面的參數,則需要使前面的參數傳入null.
7 */
8 function AccessData(request,successCallback,failureCallback,caller)
9 {
10 //設定Content-Type為application/json形式
11 Ext.Ajax.defaultPostHeader = 'application/json';
12
13 //訪問失敗的統一回呼函數
14 var onFailure = function(r, opts)
15 {
16 alert(r.responseText);
17 }
18
19 var onSuccess = function(response, options)
20 {
21 var obj = eval('(' + response.responseText + ')');
22
23 if(0 == obj.AccessDataResult.Result)
24 {
25 if(null != successCallback)
26 {
27 if(null == caller)
28 {
29 successCallback(obj.AccessDataResult.OutMsg);
30 }
31 else
32 {
33 //定義回呼函數的範圍為調用者
34 var successCallbackDelegate = Ext.Function.bind(successCallback,caller);
35 successCallbackDelegate(obj.AccessDataResult.OutMsg);
36 }
37 }
38 }
39 else if(99 == obj.AccessDataResult.Result)
40 {
41 InitLogin();
42 }
43 else
44 {
45 if(null != failureCallback)
46 {
47 if(null == caller)
48 {
49 failureCallback(obj.AccessDataResult.OutMsg);
50 }
51 else
52 {
53 var failureCallbackDelegate = Ext.Function.bind(failureCallback,caller);
54 failureCallbackDelegate(obj.AccessDataResult.OutMsg);
55 }
56 }
57 else
58 {
59 alert(obj.AccessDataResult.OutMsg);
60 }
61 }
62 }
63
64 //如果request.parm.Parms是一個JSON對象,則需要將其先轉換為字串,
65 //主要是因為背景WCF介面,只接受字串參數.如果直接傳入JSON對象,
66 //則後台參數需定義為object,也不是很方便解析
67 request.parm.Parms = Ext.JSON.encode(request.parm.Parms);
68
69 Ext.Ajax.request(
70 {
71 url: './wcf/ExampleWcf.svc/AccessData',//要訪問的方法地址
72 method: 'POST',
73 params: Ext.JSON.encode(request), //把輸入參數進行JSON編碼
74 scope: caller, //緩衝回呼函數範圍
75 success: onSuccess,
76 failure: onFailure
77 });
78 }