Angular:如何在状态更改时调用范围方法?

时间:2016-05-09 09:01:04

标签: javascript angularjs angular-ui-router

stateChangeSuccess等角度的UI-Router事件在rootScope级别被触发,因此与这些事件相关的代码大多位于RootCtrl

我有两个状态回家,约有HomeCtrlAboutCtrl

stateChange'about'我想在AboutCtrl中调用一个方法...我怎样才能实现这一目标?

注意:我可以致电$scope.RootCtrlMethod,因为stateChangeSuccess代码是用RootCtrl编写的,但AboutCtrl不能执行相同操作。

示例:RootCtrl

function($rootScope, $scope){
    $scope.someFun = function(){
        console.log("called");
    }

    $rootScope.$on('routeChangeSuccess', function(event, toState, fromState,...){
    if(toState.name == '/'){
        $scope.someFun();
        }
     }
}

1 个答案:

答案 0 :(得分:2)

这里的一个技巧是将该事件完全挂钩在 $scope 上,而不是*$rootScope*上:

//$rootScope.$on('routeChangeSuccess', 
$scope.$on('routeChangeSuccess', 
  function(event, toState, fromState,...){
    if(toState.name == '/'){
        $scope.someFun();
        }
     }

现在我们可以访问$ scope上定义的任何方法。

但是,在这种情况下,我们需要确定,我们将清除那个钩子

var removeMe = $scope.$on('routeChangeSuccess', ...
$scope.$on("$destroy", removeMe);

因此,一旦我们的$ scope被销毁,我们就不会造成内存泄漏。