2017-07-22 5 views
1

ui-routerの$state.go機能を使用して別のコントローラと別の状態になった後でも、古いコントローラがアクティブのままであるような問題が発生しています。古いAngularJSコントローラがアンロードされない

私はこれを、各コントローラに間隔を付けてコンソールに記録してテストしました。状態を複数回変更した後、すべての以前に訪問したコントローラがアクティブなまま:

$interval(function() { 
    console.info("ACCOUNT") 
}, 1000) 

Console Log

答えて

1

公式ドキュメントavailable hereに基づいて、コントローラのスコープが破壊されたときに、$intervalを使用して作成された間隔は自動的に破棄されていません。

注:このサービスによって作成された間隔は、終了すると明示的に破棄する必要があります。 特にコントローラの有効範囲またはディレクティブの 要素が破棄されたときに、自動的に破棄されるのは ではありません。これを考慮に入れて、 適切な瞬間に常に間隔をキャンセルするようにしてください。

スコープの$destroyイベントをリッスンし、コントローラで作成されたすべての間隔を破棄することをお勧めします。

これを行うには良い方法があります。

var intervalRef; 

$scope.someFunction = function() { 
    // Save a reference to the interval's promise so that it can be canceled later 
    intervalRef = $interval(function() { 
        console.info("ACCOUNT") 
       }, 1000); 
} 

$scope.$on("$destroy", function() { 
    // When the scope of the controller is destroyed, cancel the interval 
    if (intervalRef) { 
     $interval.cancel(intervalRef); 
    } 
}); 
+0

ああ、ありがとう!おそらくそれをデバッグする最良の方法ではないでしょう。 しかし、私は$ window.onfocusを使用している間にこの問題を発見しました。これは古いコントローラと呼ばれています。 ドキュメントをもう一度見逃しているかもしれませんが、それに関する情報は見つかりませんでした。 – inventivetalent

+0

Nvm、 '$ destroy'イベントを使用してonfocusイベントを設定解除しました。 – inventivetalent

+0

'$ scope。$ on'を使ってセットアップされたイベントリスナは、' $ scope'がガベージコレクトされると自動的にクリーンアップされます。手作業ですべてを清掃する必要があります。 – CodeWarrior

関連する問題