2016-05-09 4 views
3

角度UI-ルータのイベントはrootScopeレベルで焼成し、その大部分は、これらのイベントに関連するコードがRootCtrl角度:状態変更のスコープメソッドを呼び出すにはどうすればよいですか? <code>stateChangeSuccess</code>などのため

に常駐私はHomeCtrlAboutCtrl

で、自宅と約2つの状態を持っていますon stateChange to 'about'私は方法をAboutCtrlで呼びたいと思っています...どうすればこれを達成できますか?

注:私はstateChangeSuccessコードがRootCtrlで書かれているよう$scope.RootCtrlMethodを呼び出すことができますが、AboutCtrlために同じことを行うことはできません。

例:RootCtrl

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

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

答えて

2

ここでのトリックはない*$rootScope*に、正確に$scopeにそのイベントをフックするために、次のようになります。

//$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); 

だから、我々はメモリリークを作成しないことにフックをクリアすることを、確認する必要があります。

+0

このコードをAboutCtrlに含めることをお勧めしますか? – gaurav5430

+0

これが私の提案です。あなたは、そのコントローラに関連するすべてのものにアクセスすることができます。もし適切にクリアされていれば、あなたのアプリにメモリリークは起こりません。その機能をグローバルにしたいのであれば、メソッド実装をいくつかの "シングルトン"サービスに移すべきです。 '$ scope 'への参照はありません。なぜなら、$ scope(別のコントローラ)がない場合、そのメソッドを呼び出す方法がないからです。 –

+0

これは今のところうまくいくようです。 – gaurav5430

関連する問題