AngularJs:ページの再読み込み


135
<a ng-href="#" class="navbar-brand" title="home" data-translate>PORTAL_NAME</a>

ページをリロードしたい。これどうやってするの?

回答:


265

サービスのreload方法をご利用$routeいただけます。$routeコントローラに注入してから、でメソッドreloadRouteを作成します$scope

$scope.reloadRoute = function() {
   $route.reload();
}

その後、次のようなリンクで使用できます。

<a ng-click="reloadRoute()" class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

このメソッドは、現在のルートをリロードさせます。ただし、完全な更新を実行する場合は、それを挿入$windowして使用できます。

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


後で編集(ui-router):

JamesEddyEdwardsとDuncの回答で述べたように、angular-ui / ui-routerを使用している場合は、次のメソッドを使用して現在の状態/ルートをリロードできます。$state代わりに注入するだけで$route、次のようになります:

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

2
これは、リロードをAngulariseする必要がある場合に適しています。
スパイクヒープ2014

すべてのリンクにアクションを追加する代わりに、この動作をグローバルに変更するにはどうすればよいですか
OMGPOP

@OMGPOPすべてのリンクに対してグローバルに正確に何を意味しますか?
Alexandrin Rus

つまり、すべてのリンクでこれを行う必要があります。すべてのリンクに対して一度設定することは可能ですか?
OMGPOP 2015

@AlexandrinRusこれは私に次の[$ rootScope:infdig] 10回の$ digest()反復に達したことを示しています。中止します!
alphapilgrim 2016年

52

windowオブジェクトは$windowサービスを介して利用可能になり、テストとモックが容易になります。次のようなものを使用できます。

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

そして:

<a ng-click="reloadPage"  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

ちなみに、$ route.reload()が実際にページをリロードするのではなく、ルートのみをリロードすると思います。


2
$window代わりに使用することをお勧めしますwindow
Jeroen

あなたの貢献をありがとう。理由を教えてください。
フローリアンF.

1
うん、ごめん。それ$windowドキュメントによって最もよく説明されますそれは主にそれreloadPageがそれを使うとき(より良い)テスト可能であるから$windowです。
Jeroen

19
 location.reload(); 

トリックを行います。

<a ng-click="reload()">

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

ルートも何も必要ありません


2
シンプルさが大好き!
Shawn de Wet

14

アレクサンドリンの答えに似ていますが、$ routeではなく$ stateを使用します。

(JimTheDevのSOの回答はこちらから。)

$scope.reloadState = function() {
   $state.go($state.current, {}, {reload: true});
}

<a ng-click="reloadState()" ... 

9

Angularsを使用する場合、私が絶対にお勧めするより高度なui-routerを使用する場合は、次のように簡単に使用できます。

$state.reload();

これは基本的にDuncの答えと同じです。


5

無限ループを回避するための私の解決策は、リダイレクトを行った別の状態を作成することでした:

$stateProvider.state('app.admin.main', {
    url: '/admin/main',
    authenticate: 'admin',
    controller: ($state, $window) => {
      $state.go('app.admin.overview').then(() => {
        $window.location.reload();
      });
    }
  });

2

Angular 2+

Angular 2+を検索しているときにこれを見つけたので、ここに方法があります:

$window.location.reload();

1
これは角度に固有ではありません。ちなみに、JavaScriptの方法です。
Nitin Jadhav

1

使用するのは簡単$route.reload()です(コントローラーに$ routeを挿入することを忘れないでください)が、例からは "ng-href"の代わりに "href"を使用することもできます。

<a href=""  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

Angularが{{}}タグのコンテンツを置き換える前に、ng-hrefを使用して、クリックによって引き起こされる無効なリンクからユーザーを保護する必要があるだけです。


$ routeはng.route.IRouteService ??の一部です
クラッカー2016年

1

Angular 1.5-全ページを更新せずにデータのみを再読み込みしたい上記のソリューションのいくつかを試した後、データを適切にロードすることに問題がありました。ただし、別のルートに移動して現在のルートに戻ると、すべてが$route.reload()正常に機能することに気付きましたが、を使用して現在のルートのみをリロードしたい場合、一部のコードが正しく実行されません。次に、次の方法で現在のルートにリダイレクトしようとしました:

$scope.someFuncName = function () {
    //go to another route
    $location.path('/another-route');
};

モジュールの設定で、別のものを追加しますwhen

.config(['$routeProvider', function($routeProvider) {
     $routeProvider.when('/first-page', {
         templateUrl: '/first-template',
         controller: 'SomeCtrl'
     }).when('/another-route', {//this is the new "when"
         redirectTo: '/first-page'
     });
}])

そしてそれは私にとってはうまくいきます。ページ全体を更新するのではなく、現在のコントローラーとテンプレートをリロードするだけです。私はそれが少しハックだと知っていますが、それが私が見つけた唯一の解決策でした。


より簡単な方法かもしれませんvar reload = $location.url(); $location.url(''); $timeout(function() { $location.url(reload); });。ランダムなルートを作成する必要はありません。しかし、どのコードがあなたのために再評価しないかを見るのは興味深いでしょう。redirectTosやresolve関数でさえ、通常どおり再実行される$route.reload()ように見えます(console.logを見てください)。
ハッシュブラウン2018

1
<a title="Pending Employee Approvals" href="" ng-click="viewPendingApprovals(1)">
                    <i class="fa fa-user" aria-hidden="true"></i>
                    <span class="button_badge">{{pendingEmployeeApprovalCount}}</span>
                </a>

そしてコントローラーで

 $scope.viewPendingApprovals = function(type) {
                if (window.location.hash.substring(window.location.hash.lastIndexOf('/') + 1, window.location.hash.length) == type) {
                    location.reload();
                } else {
                    $state.go("home.pendingApproval", { id: sessionStorage.typeToLoad });
                }
            };

とルートファイル

.state('home.pendingApproval', {
        url: '/pendingApproval/:id',
        templateUrl: 'app/components/approvals/pendingApprovalList.html',
        controller: 'pendingApprovalListController'
    })

したがって、URLで渡されたIDがアンカーをクリックして呼び出された関数からのIDと同じである場合は、単純にリロードします。それ以外の場合は、要求されたルートに従います。

これが役立つ場合、私がこの答えを改善するのを助けてください。どんな提案でも大歓迎です。


ページがリロードされない理由を解明するのに1か月かかりました
sam

0

これは、単純なJavaScriptでウィンドウオブジェクトのreload()メソッドを呼び出すことで実行できます。

window.location.reload();


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.