2013-03-05 41 views
1

我對道場的AMD自定義模塊,將是這樣的:調用兄弟方法

define(
    "my/moduleName", 
    [//dependencies], 
    function(xhr) { 
    return { 
     method1: function() { 
     xhr.get({ 
      url: "myurl", 
      load: function(data) { 
      //handle data 
      this.method2(data) //< THIS CAUSES ERROR: 'this.method2 is not a function' 
      } 
     }); 
     }, 

     method2: function(data) { 
     //process data 
     } 
    } 
} 

我懷疑我的問題是,​​創建一個延遲對象,method2沒有在該對象中定義,而是在「我的/模塊」對象中定義。

如何使method1致電method2xhr已完成後?

回答

1

您需要存儲當前的this上下文,因爲一旦您進入load函數上下文this是xhr對象。

常見約定是var that = this;然後在需要的任何其他閉包內使用that

商店this之前類似這樣的電話:

define(
    "my/moduleName", [ //dependencies], 
function (xhr) { 
    return { 
     method1: function() { 
      var that = this; //<-- store this context 

      xhr.get({ 
       url: "myurl", 
       load: function (data) { 
        //handle data 
        that.method2(data); //<-- use that , the stored context 
       } 
      }); 
     }, 

     method2: function (data) { 
      //process data 
     } 
    } 
} 

DEMO - 在另一封店this供以後使用


+0

真實的,但我在計算器的編輯寫了這個說明我的問題,我沒有與我的實際代碼的問題。雖然 – rantsh 2013-03-05 16:34:05

+0

@rantsh:你應該總是發佈代碼,因爲你正在使用它,或者這個問題可能會被錯誤解釋:)你可以先將實際的'this'上下文存儲在函數中,然後需要時使用緩存的上下文。一個常見的約定是'var that = this',而不是稍後在需要的地方使用'that'。 – Nope 2013-03-05 16:43:36