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

IT技术 javascript angularjs
2021-03-15 04:05:31

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

我努力了:

<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().

6个回答

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

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

参见jsFiddle

但是我的标题中有 2 个按钮,一个用于主页,一个用于返回,如果我理解您的代码,则链接函数中的元素是在这种情况下单击的元素 history.back 也适用于主页按钮?(这不好)
2021-04-15 04:05:31
这段代码是不可测试的,你真的应该使用 '$window' 对象而不是 'window'。
2021-04-21 04:05:31
我稍微改变了这个例子。现在有两个按钮(后退和前进)。它现在使用 jQuery,这意味着单击时需要 scope.$apply()。
2021-04-29 04:05:31
@Neil,Angular自豪地不支持 IE8。所以不行。
2021-05-01 04:05:31
这适用于 IE8 吗?我不相信它有历史
2021-05-04 04:05:31

Angular 路由会观察浏览器的位置,因此只需window.history.back()单击某些内容即可。

HTML:

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

JS:

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

我通常在我的应用程序控制器上创建一个名为“$back”的全局函数,我通常把它放在 body 标签上。

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

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

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

来源:我被困在“全局”应用程序 $scope 中的东西咬我太多次了,我已经停止使用这种技术来支持服务。这仍然可以被践踏,但更容易解决。
2021-04-22 04:05:31
我建议不要在“全局函数”中放置任何东西。全局状态可能发生很多事情在这种情况下,主要是它的波动性。来自第三方(或其他开发人员,如果您在大型团队中)的代码,例如指令或服务可以轻松修改 $scope.$back 的子代。这可能很难调试。将服务注入每个组件并在需要的地方公开功能绝对是更好的做法。该示例仅适用于“应用程序全局”,但存在风险
2021-05-07 04:05:31

理想情况下使用一个简单的指令来使控制器免受冗余 $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 依赖项 - 这很重要。
2021-05-08 04:05:31

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

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>
一旦您重新排序关闭curl并重命名指令和元素 attr 以相互匹配,似乎就可以工作。
2021-04-22 04:05:31

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

我通过使用它来工作:

setTimeout(function() {
  $window.history.back();
},100);
其他答案使用 plain window您似乎正在使用$windowAngular 服务。也许这是根本原因?
2021-04-16 04:05:31
@Kevin 100 毫秒只是我认为合理的持续时间,而且我并不明显。事实上,较小的延迟可能会奏效。
2021-04-20 04:05:31
在我的应用程序中使用 Angular 默认导航时,我在最新的 Chrome 中遇到了类似的问题,延迟也无济于事。只有禁用 Angular 的导航管理才有帮助。
2021-05-06 04:05:31
我在 IE9 下遇到了同样的错误,这解决了问题。参见github.com/angular/angular.js/issues/1417他使用 $window 是对的,在这一点上所有其他答案都是“错误的”,参见docs.angularjs.org/api/ng.$window
2021-05-08 04:05:31
知道为什么是 100 毫秒吗?这是相当的延迟,它可以用更少的时间工作吗?
2021-05-13 04:05:31