2014-05-02 35 views
9

我有一個代碼,在init中使用$ scope。$,然後在函數中使用,因此代碼被多次執行。如何在我再次綁定之前先解除綁定。我已經嘗試了$ scope。$ off,但是沒有這樣的函數,docs.angularjs.org/api沒有提及$ on。我正在使用角度1.0.6。

+0

的【如何退訂在angularJS廣播事件可能重複。如何刪除通過$上註冊的函數](http://stackoverflow.com/questions/14898296/how-to-unsubscribe-to-a-broadcast-event-in-angularjs-how-to-remove-function-reg) – Julien

回答

26

如果不註銷的情況下,你會得到一個內存泄漏,因爲你傳遞給$上不會得到清理(如對它的引用仍然存在)的功能。更重要的是,任何在其作用域中引用的變量也會被泄漏。如果您的控制器在應用程序中被多次創建/銷燬,這將導致您的函數被多次調用。 幸運的是,AngularJS提供了一些有用的方法,以避免內存泄漏和不受歡迎的行爲:

  • 方法上的$返回一個可調用函數取消註冊事件偵聽器。
  • 每當範圍在Angular中被清除(即控制器被銷燬),就會在該範圍上觸發$ destroy事件。你可以註冊$ scope的$ destroy事件並從那裏調用你的cleanUpFunc。

參見文檔

示例代碼:

angular.module("TestApp") 
     .controller("TestCtrl",function($scope,$rootScope){ 
     var cleanUpFunc = $scope.$on('testListener', function() { 
      //write your listener here 
     }); 

     //code for cleanup 
     $scope.$on('$destroy', function() { 
     cleanUpFunc(); 
     };  
    }) 
+0

它在哪裏記錄?我無法在https://docs.angularjs.org/api找到它 – jcubic

+1

http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$on – suneetha

+0

您是否需要取消註冊該活動'$ destroy'的處理程序? –

5

$scope.$on返回,你可以打電話註銷功能。

+0

是否記錄在某處? – jcubic

+1

是的,它是:https://docs.angularjs.org/api/ng/type/$rootScope.Scope – dude

+0

但是,它不舒服,因爲如果你想在不同的功能註銷一個事件,你需要通過註銷功能通過不同的功能作爲參數 – dude

相關問題