extjs ajax 回呼函數範圍的問題

來源:互聯網
上載者:User

    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 }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.