AngularJSを使用してページ全体を再読み込みまたは再レンダリングする方法


299

いくつかのユーザーコンテキストに基づいてページ全体をレンダリングし、いくつかの$http要求を行った後、ユーザーがコンテキストを切り替えてすべてを再度レンダリングできるようにしたい(すべての$http要求を再送信するなど)。ユーザーを別の場所にリダイレクトするだけであれば、物事は適切に機能します。

$scope.on_impersonate_success = function(response) {
  //$window.location.reload(); // This cancels any current request
  $location.path('/'); // This works as expected, if path != current_path
};

$scope.impersonate = function(username) {
  return auth.impersonate(username)
    .then($scope.on_impersonate_success, $scope.on_auth_failed);
};

を使用すると、応答を待機しているリクエストの$window.location.reload()一部がキャンセルされるため、使用できません。また、ハッキングも機能しません(何も起こりません)。$httpauth.impersonate(username)$location.path($location.path())

手動ですべてのリクエストを再度発行せずにページを再レンダリングする別の方法はありますか?


Alvaro Joaoが以下で言うように、これを機能させるには、angular-route.jsを使用する必要があります。 bennadel.com/blog/...
イヴォンヌAburrow

回答:


404

記録のために、angularに現在のページを再レンダリングすることを強制するには、以下を使用できます。

$route.reload();

AngularJSのドキュメントによると:

$ locationが変更されていなくても、$ routeサービスは現在のルートを再読み込みします。

その結果、ngViewは新しいスコープを作成し、コントローラーを再インスタンス化します。


6
コメントをありがとうございます。何らかの理由で$route.reload()、通常の更新と比較して使用すると少し異なる動作をするようです。たとえば、タブは最初は更新時に表示されるように設定されていますが、reloadメソッドがタブを設定せずにページをリロードするように見える場合、問題は不明です。
Doug Molineux 2014年

2
これはフィルター/サービスも実行しますか?望ましくない永続的な状態を取得します。編集:質問に正しく答えるためにまだ賛成です&これはとても役に立ちます。ありがとう
2014年

10
$routeこれを機能させるには、コントローラに注入することを忘れないでください。
Neel

6
@alphapilgrim ngRouteモジュールはコアの一部ではなくなりましたangular.js file。あなたが使用することを継続している場合$routeProvider、あなたは今含める必要がありますangular-route.js:あなたのHTMLに
アルバロジョアン

3
$ state.reload()(stateProviderを使用している場合)
Lalit Rao

314

$route.reload()コントローラーは再初期化しますが、サービスは再初期化しません。アプリケーションの状態全体をリセットしたい場合は、以下を使用できます。

$window.location.reload();

これは、$ windowサービスの注入にアクセスできる標準のDOMメソッドです。

サーバーからページを確実にリロードしたい場合、たとえばDjangoまたは別のWebフレームワークを使用していて、サーバー側の新しいレンダリングが必要な場合は、ドキュメントで説明されいるようにtrueパラメーターとしてに渡します。それはサーバーとの相互作用を必要とするので、それは遅くなりますので、必要な場合にのみ行ってくださいreload

角度2

上記の私は角度2を使用していない角度の1に適用され、サービスのように見えますが異なっている、そこにあるRouterLocationDOCUMENT。そこでは異なる動作をテストしていません


2
サービスの「再起動」を要求するために、サービスに状態を保存するべきではないことに注意してください。
andersonvom 2014年

19
誰が言ったの?キャッシュされたデータをどこに保存することになっていますか?
ダンザ2014年

5
サービスに格納されているデータが原因で多くのバグに遭遇し、ステートレスではなくステートフルになりました。キャッシングサービス(この場合、それをフラッシュするためのインターフェイスが存在します)について話しているのでない限り、データをサービスの外およびコントローラー内に保持します。たとえば、データをlocalStorageに保持し、サービスを使用してそれにアクセスすることができます。これにより、サービスが直接データを保持する必要がなくなります。
andersonvom 2014年

2
@danza キャッシュされたデータをどこに保存することになっていますか?...モデルオブジェクト?Howver Angularは、MVCSの構成要素に名前を付けるというひどい仕事をしました。module.value APIを介して注入可能なモデルオブジェクトを保持します。次に、モデルサービスを変更するngサービスで定義したさまざまなAPIは、コマンドのように機能します。
jusopi 2014年

2
確かにそれはうまくいきますが、それは良い習慣ではありません。$ windowに関するドキュメントを参照してください。その理由は最初に説明されています。windowはJavaScriptでグローバルに使用できますが、グローバル変数であるため、テスト容易性の問題が発生します。Angularでは常に$ windowサービスを通じて参照するため、テストのためにオーバーライド、削除、またはモックされている可能性があります
danza

38

指定されたルートパスのページをリロードする場合:-

$location.path('/path1/path2');
$route.reload();

6
理由はわかりませんが、ここでは.reload()メソッドが機能しないようです。それは何も実現しません。
mircobabini 2014

28

角度のあるui-routerを使用している場合、これが最適なソリューションです。

$scope.myLoadingFunction = function() {
    $state.reload();
};

共有ホスティングへのデプロイ後の私のcliプロジェクト。私がプロジェクトをリロードすると、これを解決するための404エラーが発生しました。「ハッシュを使用」を追加すると、「#」で機能しますが、これは必要ありません。解決できる方法があります。
T.シャシュワット

24

コントローラの依存関係を宣言するときに「$ route」を追加するのを忘れたのかもしれません。

app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {   
   // $route.reload(); Then this should work fine.
}]);

9

すべてをリロードするには、window.location.reload();を使用します。angularjsで

実施例を確認する

HTML

<div ng-controller="MyCtrl">  
<button  ng-click="reloadPage();">Reset</button>
</div>

angularJS

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.reloadPage = function(){window.location.reload();}
}

http://jsfiddle.net/HB7LU/22324/


7

使用しているサービスを更新しながらコントローラーを更新したい場合は、次のソリューションを使用できます。

  • $ stateを挿入する

すなわち

app.controller('myCtrl',['$scope','MyService','$state', function($scope,MyService,$state) {

    //At the point where you want to refresh the controller including MyServices

    $state.reload();

    //OR:

    $state.go($state.current, {}, {reload: true});
}

これにより、コントローラとHTMLが更新され、RefreshまたはRe-Renderと呼ぶことができます。


2
これは、角度用ではなく、UIルーター用です。
dgzornoza 2016

6

Angular 2の前(AngularJs)

ルート経由

$route.reload();

アプリケーション全体をリロードしたい場合

$window.location.reload();

Angular 2+

import { Location } from '@angular/common';

constructor(private location: Location) {}

ngOnInit() {  }

load() {
    this.location.reload()
}

または

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}

FYI-Angular 7:「プロパティ 'reload'はタイプ 'Location'に存在しません」
ACEG

@クリスティーナはあなたの情報に感謝します。私はこれを角7の前に使用します
Thilina Sampath

5

私が考えた最も簡単な解決策は、

戻ってきたときに毎回リロードしたいルートに「/」を追加します。

例えば:

次の代わりに

$routeProvider
  .when('/About', {
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

使用する、

$routeProvider
  .when('/About/', { //notice the '/' at the end 
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

2
@PardeepJainこれは私のために働いた。これが答えです。私の回答に反対票を投じましたか?
diyoda_ 2016

1
いいえ、まったくありません。あなたの回答は反対票を投じるのにそれほど悪くありません。驚くべきことに、angular2で同じことが機能しないのはなぜですか。
Pardeep Jain、2016

2
完璧なソリューション。ありがとう!
サイモン

これは、元のパスがアプリケーションのルートである場合でも機能します- /:O私のルートは次のようになります://
MadPhysicist

Angular 6では#を使用した後に機能し、Angular2でも同じように使用できます。そう思う
T.シャシュワット

5

次のいずれかを試してください。

$route.reload(); // don't forget to inject $route in your controller
$window.location.reload();
location.reload();

4

キャッシュを削除してページを再読み込みするためのこの作業コードを取得しました

見る

        <a class="btn" ng-click="reload()">
            <i class="icon-reload"></i> 
        </a>

コントローラ

インジェクター:$ scope、$ state、$ stateParams、$ templateCache

       $scope.reload = function() { // To Reload anypage
            $templateCache.removeAll();     
            $state.transitionTo($state.current, $stateParams, { reload: true, inherit: true, notify: true });
        };

3

ユーザーに親密なリロード通知をせずに次のコードを使用します。ページをレンダリングします

var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();

-8

私は何ヶ月もこの問題に苦労してきました、そして私のために働いた唯一の解決策はこれです:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;

4
これは$window.location.reload()、OPが彼の場合に正しく機能しないと具体的に述べていることとほとんど変わりません。
すべての労働者は必須
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.