如何在angular.js中实现history.back()

bab*_*dev 188 javascript angularjs

我有指令是带有后退按钮的站点标题,我想点击返回上一页.我如何以有角度的方式做到这一点?

我试过了:

<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>
Run Code Online (Sandbox Code Playgroud)

这是指令js:

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

但没有任何反应.我在angular.js API中查看了关于$ location但没有找到任何关于后退按钮或history.back().

asg*_*oth 261

您需要在指令中使用链接函数:

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

jsFiddle.

  • 这段代码是不可测试的,你应该使用'$ window'对象而不是'window'. (8认同)
  • @Neil,Angular**自豪**不支持IE8.所以不行. (5认同)

And*_*lin 132

Angular路线观察浏览器的位置,因此只需window.history.back()点击一下即可使用.

HTML:

<div class="nav-header" ng-click="doTheBack()">Reverse!</div>
Run Code Online (Sandbox Code Playgroud)

JS:

$scope.doTheBack = function() {
  window.history.back();
};
Run Code Online (Sandbox Code Playgroud)

我通常在我的应用程序控制器上创建一个名为'$ back'的全局函数,我通常将其放在body标签上.

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

然后在我的应用程序的任何地方,我可以做 <a ng-click="$back()">Back</a>

(如果您希望它更易于测试,请将$ window服务注入您的控制器并使用$window.history.back()).

  • 我建议不要把任何东西放在"全局函数"中.[全球各州可能发生很多事情](http://programmers.stackexchange.com/a/148109/26025).在这种情况下,它主要是它的波动性.来自第三方(或其他开发人员,如果您在一个大型团队中)的代码,例如,指令或服务可以很容易地修改$ scope.$ back for it's children.这可能很难调试.将服务注入每个组件并在需要的地方公开功能绝对是更好的做法.这个例子只是"应用程序的全局",但存在风险 (9认同)

Dar*_*ren 65

理想情况下,使用简单的指令使控制器不受冗余$ window的影响

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

使用这样:

<button back>Back</button>
Run Code Online (Sandbox Code Playgroud)


ple*_*ock 20

另外一个不错的和可重复使用的解决方案是建立就像一个指令,这个:

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

然后就像这样使用它:

<a href back-button>back</a>
Run Code Online (Sandbox Code Playgroud)


Rob*_*ave 18

如果它有用......我正在达到"10 $ digest()迭代次数.中止!" 使用$ window.history.back()时出错 使用IE9(当然在其他浏览器中工作正常).

我通过使用它得到它的工作:

setTimeout(function() {
  $window.history.back();
},100);
Run Code Online (Sandbox Code Playgroud)

  • 我在IE9下得到了同样的错误,这解决了这个问题.请参阅https://github.com/angular/angular.js/issues/1417他对使用$ window是正确的,所有其他答案都是"错误的",请参阅http://docs.angularjs.org/api/ NG.$窗口 (7认同)