angular.jsにhistory.back()を実装する方法


190

戻るボタン付きのサイトヘッダーであるディレクティブがあり、クリックすると前のページに戻ります。どうすれば角度のある方法でそれを行うのですか?

私が試してみました:

<header class="title">
<a class="back" ng-class="icons"><img src="../media/icons/right_circular.png" ng-click="history.back()" /></a>
<h1>{{title}}</h1>
<a href="/home" class="home" ng-class="icons"><img src="../media/icons/53-house.png" /></a>   
</header>

そしてこれはjsのディレクティブです:

myApp.directive('siteHeader', function () {
    return {
        restrict: 'E',
        templateUrl: 'partials/siteHeader.html',
        scope: {
            title: '@title',
            icons: '@icons'
        }
    };
});

しかし、何も起こりません。$ locationについてangular.js APIを調べましたが、戻るボタンやについては何も見つかりませんでしたhistory.back()


1
これはあなたのためにうまくいったと述べました。アプリ内の別のページに移動しますか、それともブラウザに戻りますか?それは私にブラウザを戻すようです。
Chookoos 2013

HTML5モードを使用するようにAngularJSを設定している場合、ブラウザーの履歴に既にあるページに移動すると、キャッシュされたバージョンが使用され、再ロードされません。私が取り組んでいるプロジェクトでは、古いコードと新しいコードが混在しており、AngularJSでデータを保存すると前のページが変更されます。AngularJSを使用するように最初のページをアップグレードするオプションではないため、最初のページにリダイレクトするために、3番目の非AngularJSページをロードする必要がありました。良い解決策ではありませんが、うまくいきます。
CJデニス

回答:


262

ディレクティブでリンク関数を使用する必要があります:

link: function(scope, element, attrs) {
     element.on('click', function() {
         $window.history.back();
     });
 }

jsFiddleを参照してください。


しかし、私は自分のコードにリンク関数の要素がその場合にクリックされた要素であることを理解している場合、ホーム用とバック用の2つのボタンをヘッダーに持っています。履歴は、ホームボタンにも適用されますか? )
baba-dev

例を少し変更しました。現在、2つのボタン(戻ると進む)があります。現在jQueryを使用しています。つまり、クリックするとscope。$ apply()が必要になります。
asgoth

8
このコードはテストできません。「ウィンドウ」の代わりに「$ウィンドウ」オブジェクトを実際に使用する必要があります。
アービター2013

これはIE8で動作しますか?私はそれが歴史を持っているとは信じていません
Neil

5
@Neil、角度は誇らしげに IE8をサポートしていません。だから、違います。
2015

133

Angularルートはブラウザの位置を監視するので、単に window.history.back()何かをクリックする機能します。

HTML:

<div class="nav-header" ng-click="doTheBack()">Reverse!</div>

JS:

$scope.doTheBack = function() {
  window.history.back();
};

私は通常、アプリのコントローラーで '$ back'というグローバル関数を作成します。これは通常、ボディタグに配置します。

angular.module('myApp').controller('AppCtrl', ['$scope', function($scope) {
  $scope.$back = function() { 
    window.history.back();
  };
}]);

その後、私のアプリのどこでも私はただ行うことができます <a ng-click="$back()">Back</a>

(よりテストしやすくしたい場合は、$ windowサービスをコントローラーに挿入し、を使用します$window.history.back())。


9
「グローバル関数」には何も入れないことをお勧めします。世界の国家に起こり得ることは非常にたくさんあります。この場合、それは主にそれのボラティリティです。たとえば、サードパーティ(または大規模なチームの場合は別の開発者)のコード、ディレクティブ、またはサービスは、その子の$ scope。$ backを簡単に変更できます。これはデバッグが難しい場合があります。各コンポーネントにサービスを注入し、必要に応じて機能を公開することは間違いなく良い方法です。例は「アプリ全体」のみですが、リスクがあります
Ben Lesh

出典:「グローバル」なアプリで立ち往生したものが$ scopeに何度も噛まれて数えられなくなったため、サービスを優先してその手法を使用しなくなりました。それでもまだ踏みにじることができますが、それは簡単に思いつくことができます。
Ben Lesh 2014年

65

理想的には、コントローラーを冗長な$ windowから解放するために単純なディレクティブを使用します

app.directive('back', ['$window', function($window) {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
                elem.bind('click', function () {
                    $window.history.back();
                });
            }
        };
    }]);

このように使用します:

<button back>Back</button>

$ windowの依存関係を示してくれてうれしいです-それは重要です。
Chris Smith、

20

別の優れた再利用可能なソリューションは、次のようなディレクティブを作成することです。

app.directive( 'backButton', function() {
    return {
        restrict: 'A',
        link: function( scope, element, attrs ) {
            element.on( 'click', function () {
                history.back();
                scope.$apply();
            } );
        }
    };
} );

次に、次のように使用します。

<a href back-button>back</a>

1
閉じた中括弧を並べ替え、ディレクティブと要素の属性を互いに一致するように名前を変更すると、機能するようです。
2014

18

便利な場合...私は「10回の$ digest()の反復に達しました。中止します!」$ window.history.back();使用時のエラー IE9で(もちろん他のブラウザでも問題なく動作します)。

私はそれを使用して動作させました:

setTimeout(function() {
  $window.history.back();
},100);

他の答えは平野を利用しますwindow$windowAngularサービスを使用しているようです。多分これが根本的な原因ですか?
superjos 2013年

7
IE9で同じエラーが発生し、問題が解決しました。github.com/angular/angular.js/issues/1417を参照してください彼は$ windowの使用に問題はなく、他のすべての回答はこの点に関して「間違っています」。docs.angularjs.org
api / ng。

なぜ100msなのか?それはかなりの遅延です、それはより少ないで動作しますか?
Kevin

@Kevin 100msは、私が妥当で、imoが目立たないと思った期間に過ぎませんでした。実際、より小さな遅延でうまくいくかもしれません。
Rob Bygrave 14

アプリでAngularのデフォルトナビゲーションを使用すると、最新のChromeでも同様の問題が発生しますが、遅延も役に立ちません。Angularのナビゲーション管理無効にすることだけが役に立ちました。
ドミ2014年

3

または単に使用することができます コード:

onClick="javascript:history.go(-1);"

お気に入り:

<a class="back" ng-class="icons">
   <img src="../media/icons/right_circular.png" onClick="javascript:history.go(-1);" />
</a>

1
これは非常に多くのレベルで間違っているように見えます。ほぼ10年前のこのブログ投稿
Rocco

1

構文エラーがありました。これを試してみればうまくいくはずです:

directives.directive('backButton', function(){
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            element.bind('click', function () {
                history.back();
                scope.$apply();
            });
        }
    }
});

1

角度4:

/* typescript */
import { Location } from '@angular/common';
// ...

@Component({
  // ...
})
export class MyComponent {

  constructor(private location: Location) { } 

  goBack() {
    this.location.back(); // go back to previous location
  }
}

0

私にとっての問題は、戻って別の状態に移行する必要があったことです。したがって$window.history.back()、何らかの理由で遷移がhistory.back()が発生する前に発生したため、使用は機能しませんでした。そのため、遷移をタイムアウト関数でラップする必要がありました。

$window.history.back();
setTimeout(function() {
  $state.transitionTo("tab.jobs"); }, 100);

これで問題が解決しました。


0

AngularJS2で私は新しい方法を見つけました、おそらく同じことですが、この新しいバージョンでは:

import {Router, RouteConfig, ROUTER_DIRECTIVES, Location} from 'angular2/router'; 

(...)

constructor(private _router: Router, private _location: Location) {}

onSubmit() {
    (...)
    self._location.back();
}

私の関数の後、私のアプリケーションがangular2 / routerから前のページusginの場所に移動していることがわかります。

https://angular.io/docs/ts/latest/api/common/index/Location-class.html


動作します。@ angular / routerではなく、@ angular / commonからインポートする必要があります。
神経叢
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.