2014-06-12 65 views
0

這更多的是一般的JavaScript閉包和範圍函數,但我會在角度的上下文中詢問它。比方說,我有以下控制器:

var Controller = function ($scope, factory) { 
     $scope.Letter = 'A'; 

     /* 
      Some other code 
      . 
      . 
      . 
     */ 

     $scope.OnClick = function() { 
      console.log($scope.Letter); 
      SomethingWithCallBack('a param', 34, function() { 
       console.log($scope.Letter); 
      }); 
     } 
}; 

假設有事其中$ scope.Letter進行更新,然後onClick函數解僱。 OnClick中的$ scope.Letter保持原始值。我可以通過將該行更改爲console.log(this.Letter);來解決此問題。但是,我不能在SomethingWithCallBack()的匿名函數中執行此操作。在那裏,我現在通過如下分配一個變量值this.Letter來解決問題。

var myLetter = this.letter; 
SomethingWithCallBack('a param', 34, function() { 
    console.log(myLetter); 
}); 

有沒有辦法在回調裏面引用「outer this」,所以我不需要指定變量?

+0

你是什麼意思在onclick $ scope.letter保持原來的價值?因爲那不是真的。如果更新$ scope.letter,那麼當您調用onClick時,它將成爲新值。現在,你似乎直接在範圍上使用原語,所以這會給你帶來繼承範圍的問題,這可能會導致你認爲它不會改變。 – Zerot

+0

你是什麼意思「在範圍上使用原語?你的意思是作用域的成員(int串和日期)? –

+1

正確。通過在子範圍上設置範圍的原始值,父範圍值不會被更改。子範圍將具有自己的(相同的名稱)字段和自己的值。因此,您應該始終將對象放在您設置字段的範圍內。 – Zerot

回答

1

這是一個經典的問題,當你所有你需要做的就是這些信息存儲在另一個變量附加事件偵聽器的JavaScript之前

寫作。

var that = this; 
SomethingWithCallBack('a param', 34, function() { 
    console.log(that.myLetter); 
}); 
+0

將此存儲在另一個變量中可以使事情變得簡單。希望有更好的辦法。 –

相關問題