2016-09-26 33 views
1

任何人都可以請解釋一下$scope.$on的工作情況以及$destroy如何在這兩個控制器中工作。就像當我改變路線時,一個不同的控制器被調用,這就是爲什麼$destroy被調用? $interval如何得到初始化,我剛剛將它定義爲promiseA下的變量,但它被初始化。我只是複製這些行來滿足要求,任何人都可以幫助我理解這些代碼行嗎?

 var myApp=angular.module('myApp',['ngRoute']); 
     myApp.controller('myController',function($scope){ 


     }); 
     myApp.controller('firstPage',function($scope,$interval){ 

      $scope.thisMessage="First Message"; 
      $scope.firstcall=function(){ 
       var promiseA=$interval(function(){ 

         console.log("First Page"); 
        },10000); 
       $scope.$on('$destroy',function(){ 
        $interval.cancel(promiseA); 
       }); 
      } 
      }); 
     myApp.controller('secondPage',function($scope,$interval){ 
      $scope.thisMessage="Second Message"; 

      $scope.thisMessage="Second Message"; 
      $scope.secondcall=function(){ 
       var promiseB=$interval(function(){ 

         console.log("Second Page"); 

       },10000); 
       $scope.$on('$destroy',function(){ 
        $interval.cancel(promiseB); 
       }); 
      } 
     }); 

     myApp.config(function($routeProvider){ 
      $routeProvider.when("/",{ 
       templateUrl:"First.html" 
       }) 
      .when("/second",{ 
       templateUrl:"Second.html" 
      }); 
     }); 

回答

0

長話短說使用$scope.$on可以添加監聽器(訂閱)的角度的內部事件,並自定義事件,您可以使用$emit$broadcast服務觸發自己。 $destroy本身是一個當控制器被銷燬時觸發的事件,所以如果你想要保存一些數據或你想做的任何事情,你就有一個鉤子。

你可以在Angular的文檔here中找到更多關於這種東西的信息。

鑑於當您切換路線時,您的每條路線都有不同的控制器,因此您正在實例化一個並銷燬另一個(這會觸發您正在偵聽的$destroy事件)。

我還建議您查看$off方法,這是您可以取消訂閱事件的方式,避免了內存泄漏和奇怪的行爲。不幸的是我無法找到任何文檔,但它是如何工作的基本上是,你認購這樣一個事件:

$scope.$on('customEvent', someFunction); 

你退訂這樣的:

$scope.$on('$destroy', function() { 
    $scope.$off('customEvent', someFunction); 
}); 

記住你並不需要在$destroy聽衆中取消訂閱,但我認爲這是最佳做法。

+0

嗨,彼得。非常感謝 – evilBops

相關問題