2011-01-30 40 views
4

我有這種Ajax代碼重複了很多地方。我怎樣才能將這個重構成一個單一的方法,這樣它仍然會允許成功或失敗時的不同行爲。通過擴展類(命名空間由你),你仍然能夠操縱URL,參數,可以方法,成功和失敗Extjs Ajax代碼重構

function callme (callback) { 
    Ext.Ajax.request({ 
     url : 'ajax.php' , 
     params : { action : 'getDate' }, 
     method: 'GET', 
     success: callback, 
     failure: function (result, request) { Ext.MessageBox.alert('Failed', result.responseText); 
     } 
    }); 
} 

callme(function (result, request) { 
    Ext.MessageBox.alert('Success', 'Data return from the server: '+  result.responseText); 
}); 

回答

3
 
MyAjaxRequest = Ext.extend (Ext.Ajax.request, { 
    url : 'ajax.php' , 
    params : { action : 'getDate' }, 
    method: 'GET', 
    success: function (result, request) { 
     Ext.MessageBox.alert ('Success', 'Data return from the server: '+ result.responseText); 
    }, 
    failure: function (result, request) { 
     Ext.MessageBox.alert('Failed', result.responseText); 
     } 
}); 

Ext.Ajax.request({ 
    url : 'ajax.php' , 
    params : { action : 'getDate' }, 
    method: 'GET', 
    success: function (result, request) { 
    Ext.MessageBox.alert('Success', 'Data return from the server: '+  result.responseText); 
    }, 
    failure: function (result, request) { Ext.MessageBox.alert('Failed', result.responseText); 
    } 
}); 
+0

我應該使用`success` /`failure`還是`callback`? – fastcodejava 2011-02-01 03:27:13

2

此代碼將得到同樣的結果。如果沒有設置 - 默認值是

+0

它會指向每一次回調函數(您將它命名爲callme(第二個)我猜它是錯字)... – bensiu 2011-01-31 04:40:44

3

好的,這個問題有點古怪,但可以說有一個更靈活的方法來做到這一點。認識到Ext.Ajax是一個單例非常重要 - 也就是說,它已經是一個獨特的預先實例化的類。 「擴展」單例沒有太大意義,單獨的函數可能會不必要地混淆和/或稍後限制。

您可以添加自己的特殊Ajax請求的功能是這樣的:

Ext.Ajax.dateRequest = function(myObj){ 
    // set the pre-configured parameters here 
    myObj.url = 'ajax.php'; 
    myObj.params = { action: 'getDate'}; 
    myObj.method = 'GET'; 
    // call the original request function with the modified config object 
    this.request(myObj); 
}; 

所以,現在你可以改變你重複的Ajax請求:

Ext.Ajax.dateRequest({ 
    success: yourSuccessFunction 
    ,failure: yourFailureFunction 
}); 

這樣做的好處是,你可以很容易地將預先配置的參數添加到「dateRequest」函數中,並且您可以在不重寫任何內容的情況下爲每個Ajax請求添加附加參數(如不同的超時)。

編輯:哎呀!我原本在下面發佈了一個解決方案,我認爲它會「克隆」Ext.Ajax,但它仍然僅僅覆蓋了單例。

這是幾年前「Saki」(Ext guru)的引用。他指的是他寫常規對象/陣列的克隆功能:

克隆功能是在任何情況下意味着克隆類或 實例分機對象。這幾乎是不可能的,因爲這些安裝事件處理程序幾乎總是如此,所以克隆肯定會導致 不可預知的結果。

單例是一個「實例化的Ext對象」,因此無法輕鬆擴展或克隆。如果你不想直接混淆Ext.Ajax,你可以創建一個函數(如前所述)。這是一個較爲靈活的形式:

function dateRequest(myObj){ 
    myObj.url = 'ajax.php'; 
    myObj.params = { action: 'getDate'}; 
    myObj.method = 'GET'; 
    return Ext.Ajax.request(myObj); 
} 

然後用dateRequest({success: successFunc, failure: failFunc})調用它。