web-dev-qa-db-ja.com

単一の関数内のすべてのAngularJS $ scopeおよび$ rootScope値をクリアするにはどうすればよいですか?

すべてをクリアする必要があります$scope一部の操作の実行中の値。

例:クリックした場合"Signout"リダイレクトするボタン"signin"ページの場合、セッション内のすべての$ scopeまたは$ rootScope値をクリアする必要があります。

どうすればこれを達成できますか?

10
Gnik

次のことができます。

$rootScope = $rootScope.$new(true);
$scope = $scope.$new(true);

関数 $newは、親から変数を継承する新しいスコープを作成しています。 trueは継承を防ぎます。

しかし、これは正しいアプローチではありません。上記のものを使用する場合、bootstrapコントローラの機能を手動で実行し、スコープのツリーを再作成する必要があるためです。

これ は便利かもしれませんが、初期化されたデータをいくつかの変数に格納し、割り当てられたときに表示された変数にコピーを格納するという考え方です。

正しい解決策は、次のように、ログアウトイベントの各スコープのすべてのプロパティを手動でクリアすることです。ログアウトイベント:

$rootScope.$broadcast("logout");

イベントをキャッチ:

$rootScope.$on("logout", function(){
      $rootScope.myData = undefined;
});

または、コメントで提案されているように、サービスを使用してからクリーンアップされます。

16
Michael
               You not want delete scope 
               var authScope =['authLogo','currentPath','pageTitle','app'];                       
                for (var prop in $rootScope) {
                    if (prop.substring(0,1) !== '$') {
                        if(authScope.indexOf(prop) ==-1)
                            delete $rootScope[prop];
                    }
                }
0
Taner Özel