18

あなたはAngular.jsで$スコープ変数を操作するためのコントローラを持っている場合は、への慣用的な方法があります:再初期化Angular.jsコントローラ

  • コントローラの$スコープをリセットし、
  • 再起動コントローラの初期化は、 ?

複雑なコントローラでは、すべての変数を初期値にリセットする必要はありません。コントローラやスコープの単純な再初期化が本当に必要な場合は特に便利です。しかし、同じURLに再度$location.path()で移動することは役に立ちません。

編集:$window.locationハックを使用できないとします。これはChromeパッケージアプリケーションのCSPに違反するためです。

答えて

22

尋ねた直後に、私はついに$route.reload()を使ってこれを解決する方法を見つけました。

myapp.Controller('SampleController', function($location, $route) { 

    $scope.navTo = function(url) { 
    if ($location.path() === url) { 
     $route.reload(); 
    } else { 
     $location.path(url); 
    } 
    } 

}); 

私はまだいくつかのよりエレガントな解決策が存在しなければならないこと、考えているが、これは間違いなく私のために動作します。

+1

私は同意しない、私はこれは完全にエレガントなソリューションだと思います。ある意味では、ページをリロードしているので、$ route.reload()は非常に意味があります。 – wvdz

+6

@popovitsj:これは悪い習慣とはみなされないことを知っているのは素晴らしいことですが、私はまだ本当に確信していません。意味的に '$ route.reload()'はページのリロードに似ているので、このソリューションには魅力があるのは間違いありませんが、依然として多くのオーバーヘッドが発生します。これは、特定のユースケースの多くでは無視されるかもしれませんが(当時は間違いなく)、このオーバーヘッドを作成しないように、同じようにクリーンなメソッドを用意するのは良いことです。 – bfncs

+0

oninitの内容をプライベートメソッド( 'init')で移動してoninitから呼び出し、最後に同じプライベートメソッドを使用して何度もコントローラをリセットできますか? – JVM

2

あなたは、あなたがこのような方法でそれを行う必要があり、角度-UI-ルータを使用している場合:

myapp.Controller('SampleController', function($state) { 

    $scope.navigate = function (stateName) { 
     if ($state.is(stateName)) { 
      $state.reload(); 
     } else { 
      $state.go(stateName); 
     } 
    } 
});