關於scope和createDelegate()

關於JavaScript中this的使用,這是一個由來已久的問題了。我們這裏就不介紹它的發展歷史了,只結合具體的例子,告訴大家可能會遇到什麼問題,在遇到這些問題時EXT是如何解決的。在使用EXT時,最常碰到的就是使用Ajax回調函數時出現的問題,如下面的代碼所示。 

<input type="text" name="text" id="text">
<input type="button" name="button" id="button" value="button">

 

現在的HTML 頁面中有一個text輸入框和一個按鈕。我們希望按下這個按鈕之後,能用Ajax去後臺讀取數據,然後把後臺響應的數據放到text中,實現過程如代碼清單10-6所示。

代碼清單 Ajax中使用回調函數

function doSuccess(response) {

    text.dom.value = response.responseText;

}

 

 

Ext.onReady(function(){


 

    Ext.get('button').on('click', function(){

        var text = Ext.get('text');

        Ext.lib.Ajax.request(

            'POST',

            '08.txt',

            {success:doSuccess},

            'param=' + encodeURIComponent(text.dom.value)

        );

    });

});

 

在上面的代碼中,Ajax已經用Ext.get('text')獲得了text,以爲後面可以直接使用,沒想到回調函數success不會按照你寫的順序去執行。當然,也不會像你所想的那樣使用局部變量text。實際上,如果什麼都不做,僅僅只是使用回調函數,你不得不再次使用Ext.get('text')重新獲得元素,否則瀏覽器就會報text未定義的錯誤。

在此使用Ext.get('text')重新獲取對象還比較簡單,在有些情況下不容易獲得需要處理的對象,我們要在發送Ajax請求之前獲取回調函數中需要操作的對象,有兩種方法可供選擇:scope和createDelegate。

q   爲Ajax設置scope。

 

  function doSuccess(response) {

      this.dom.value = response.responseText;

  }

  Ext.lib.Ajax.request(

      'POST',

      '08.txt',

      {success:doSuccess,scope:text},

      'param=' + encodeURIComponent(text.dom.value)

  );               

 

在Ajax的callback參數部分添加一個scope:text,把回調函數的scope指向text,它的作用就是把doSuccess函數裏的this指向text對象。然後再把doSuccess裏改成this.dom. value,這樣就可以了。如果想再次在回調函數裏用某個對象,必須配上scope,這樣就能在回調函數中使用this對它進行操作了。

q   爲success添加createDelegate()。

 

  function doSuccess(response) {

      this.dom.value = response.responseText;

  }

 

  Ext.lib.Ajax.request(

      'POST',

      '08.txt',

      {success:doSuccess.createDelegate(text)},

      'param=' + encodeURIComponent(text.dom.value)

  );

 

createDelegate只能在function上調用,它把函數裏的this強行指向我們需要的對象,然後我們就可以在回調函數doSuccess裏直接通過this來引用createDelegate()中指定的這個對象了。它可以作爲解決this問題的一個備選方案。

如果讓我選擇,我會盡量選擇scope,因爲createDelegate是要對原來的函數進行封裝,重新生成function對象。簡單環境下,scope就夠用了,倒是createDelegate還有其他功能,比如修改調用參數等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章