いくつかのユーザーコンテキストに基づいてページ全体をレンダリングし、いくつかの$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()
を使用すると、応答を待っているauth.impersonate(username)
上の$http
リクエストの一部がキャンセルされるため、それを使用することはできません。また、ハック$location.path($location.path())
も機能しません(何も起こりません)。
手動ですべての要求を再度発行せずにページを再レンダリングする別の方法はありますか?
レコードの場合、現在のページをAngularに再レンダリングさせるには、次のようにします。
$route.reload();
AngularJSによると ドキュメント :
$ locationが変更されていなくても、$ route serviceは現在のルートをリロードします。
その結果、ngViewは新しいスコープを作成し、コントローラを再インスタンス化します。
$route.reload()
はコントローラを再初期化しますが、サービスは再初期化しません。アプリケーションの全体の状態をリセットしたい場合は、次のものを使用できます。
$window.location.reload();
これは 標準のDOMメソッド で、 $ window サービスを注入することでアクセスできます。
Djangoや他のWebフレームワークを使用しているときなど、サーバーからページを確実にリロードする必要がある場合は、 で説明されているように、true
をパラメーターとしてreload
に渡します。 。これはサーバーとのやり取りを必要とするため、遅くなりますので、必要な場合にのみ行ってください。
上記はAngular 1に適用されます。私はAngular 2を使用していません。サービスが異なるように見え、Router
、Location
、およびDOCUMENT
があります。私はそこでさまざまな行動をテストしませんでした
指定されたルートパスのページをリロードする場合: -
$location.path('/path1/path2');
$route.reload();
角度型ui-routerを使用している場合 これが最良の解決策になります。
$scope.myLoadingFunction = function() {
$state.reload();
};
たぶんあなたはあなたのコントローラの依存関係を宣言するときに "$ route"を追加するのを忘れていました:
app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {
// $route.reload(); Then this should work fine.
}]);
すべてをリロードするには、window.location.reload()を使用してください。角度付き
実施例をチェックする
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();}
}
Angular 2より前(角度)
ルート経由
$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();
}
使用しているサービスを更新しながらコントローラを更新したい場合は、次の解決策を使用できます。
すなわち.
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 と呼びます。
私が考え出した最も簡単な解決策は、
戻ってくるたびに毎回リロードしたいルートに '/'を追加します。
例えば:
次の代わりに
$routeProvider
.when('/About', {
templateUrl: 'about.html',
controller: 'AboutCtrl'
})
つかいます、
$routeProvider
.when('/About/', { //notice the '/' at the end
templateUrl: 'about.html',
controller: 'AboutCtrl'
})
次のいずれかを試してください。
$route.reload(); // don't forget to inject $route in your controller
$window.location.reload();
location.reload();
キャッシュを削除してページをリロードするためのこの実用的なコードを入手しました。
表示
<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 });
};
以下のコードは、ユーザーへの詳細なリロード通知なしに使用してください。それはページをレンダリングするでしょう
var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();