50
<h1>{{页眉}}</h1><!-- 此后退按钮有多个选项--><!-- 在主页中,它将显示菜单--><!-- 在其他视图中,它将显示反向链接--><a ng-href=“{{back.url}}”>{back.text}}</a><div ng-view>

在我的模块配置中

$routeProvider。when('/'{控制器:HomeCtrl,模板URL:'home.html'}).when(“/menu”{控制器:MenuCtrl,templateUrl:“菜单.html”}).when('/items'{控制器:ItemsCtrl,templateUrl:'items.html'}).否则({重定向到:“/”});

控制器

函数HomeCtrl($scope,$rootScope){$rootScope.header=“主页”;$rootScope.back={url:“#/menu”,text:“menu”};}功能菜单Ctrl($scope,$rootScope){$rootScope.header=“菜单”;$rootScope.back={url:“#/”,文本:“后退”};}函数ItemsCtrl($scope,$rootScope){$rootScope.header=“项目”;$rootScope.back={url:“#/”,文本:“后退”};}

正如你在我的控制器中看到的那样,我已经硬编码了后退按钮的url和文本(事实上,我不需要使用图像的文本)。通过这种方式,我发现在某些情况下后退按钮导航错误。我不能使用history.back()因为我的后退按钮变为主视图中的菜单链接。

所以我的问题是如何在控制器中获得之前的路由路径,或者是实现这一点的更好方法?

我创建了一个Plunker公司证明我的问题。请检查一下。

4
  • 当AngularJS默认提供深度链接/后退按钮功能时,为什么需要手动处理后退按钮导航(例如:wordcharconvertetor.rogtopia.com)?
    – 斯特威
    评论 2013年3月2日14:51
  • @对不起,我是angularjs的新手,我不太明白你的意思。你能提供更好的例子和更好的解释吗?请注意,我的返回链接导航的行为与浏览器的返回按钮略有不同
    – 吉安
    评论 2013年3月2日15:11
  • 你应该遵循@MarkRajcok的回答。
    – 斯特威
    评论 2013年3月3日1:00
  • 1
    我本来打算投赞成票,但你没有注意到@andersh的回答。 评论 2015年11月12日19:51

8个答案8

重置为默认值
73

此替代方案还提供了一个后退功能。

模板:

后退</a>

该模块:

myModule.run(函数($rootScope,$location){var历史=[];$rootScope$on('$routeChangeSuccess',function(){历史推送($location.$$path);});$rootScope.back=函数(){var prevUrl=history.length>1?历史记录。拼接(-2)[0]:“/”;$location.path(prevUrl);};});
5
  • 1
    顺便说一句,我认为您不需要使用$location,因为$routeChangeSucces回调是用两个参数调用的:current和next。docs.angularjs.org/api/ng路线$路线 评论 2013年11月22日13:52
  • 2
    @KennethLynne我试着用电流$$route.originalPath(路由原始路径)而不是$位置$$路径但路由参数仅在使用时填写$位置。如果你不使用路由参数,那么你的建议应该有效。 评论 2014年3月18日16:51
  • 它应该与本地存储一起使用以实现持久性。否则,如果刷新页面,历史记录将消失。
    – 吉安
    评论 2016年2月12日4:33
  • 您正在rootscope中存储,但当页面刷新时(当用户输入ctrl+F5时),它将消失,对吗??那么,在哪里存储这个back函数????
    – 苏迪尔
    评论 2016年4月19日9:21
  • 是的,@sudhir,历史记录无法在页面刷新后保存下来,如果需要持久保存,则可能应该使用本地存储来存储历史记录数组。
    – 安德斯
    评论 2016年4月19日11:59
22

使用$locationChangeStart或$locationChangeSuccess事件,第三个参数:

$scope$on(“$locationChangeStart”,函数(evt,absNewUrl,absOldUrl){console.log('start',evt,absNewUrl,absOldUrl);});$scope$on('$locationChangeSuccess',函数(evt,absNewUrl,absOldUrl){console.log('success',evt,absNewUrl,absOldUrl);});
2
  • 2
    谢谢@ArturBodera,我看到它们现在记录在这里:docs.angularjs.org/api/ng.$location#事件我更新了答案。 评论 2013年12月9日16:17
  • 这挽救了我的一天。。。我遇到了一个不重新加载控制器的问题$路由参数由于用户在浏览器中操作“后退”和“前进”按钮而更改。通过这些事件,我可以捕捉到这个导航。 评论 2014年12月2日14:06
19

在html中:

返回</a>

在主控制器上:

$scope.go_back=函数(){$window.history.back();};

当用户单击“返回”链接时,会调用控制器函数,它将返回到上一条路线。

2
  • 就我而言,我不需要$,我刚用过window.history.back(); 评论 2016年6月16日3:27
  • @应用程序开发人员$窗口是一个有棱角的包装窗口,我们鼓励您使用它,而不是窗口,因为这样可以模拟测试等(docs.angularjs.org/api/ng/service/$window):“在角度上,我们总是指它[指窗口]通过$window服务,因此可以覆盖、删除或模拟它进行测试。" 评论 2017年1月13日16:45
5

@andresh对我来说,locationChangeSuccess比routeChangeSu成功更有效。

//使用此back()调用返回到上一阶段var历史=[];$rootScope$on('$locationChangeSuccess',function(){历史推送($location.$$path);});$rootScope.back=函数(){var prevUrl=history.length>1?历史记录。拼接(-2)[0]:“/”;$location.path(prevUrl);历史=[]//返回后删除历史数组};
4

这是我当前如何在$rootScope:

运行(['$rootScope',函数($rootScope){$rootScope$on('$locationChangeStart',function(){$rootScope.previousPage=位置路径名;});}]);
4

您需要将事件侦听器耦合到Angular 1.x中的$rootScope,但您可能应该通过不在$rootScoper上存储以前位置的值来为您的代码提供一些未来的证明。存储价值的更好地方是服务:

var app=角度模块('myApp',[]).service('locationHistoryService',函数(){返回{上一个位置:null,存储:功能(位置){this.previousLocation=位置;},获取:函数(){return this.previousLocation;}}).run([“$rootScope”,“locationHistoryService”,function($location,locationHistoryService){$rootScope$on(“$locationChangeSuccess”,函数(e,newLocation,oldLocation){locationHistoryService.store(旧位置);});}]);
1
  • 智能解决方案的目标是在全球范围内保存url,否则对于单个案例,@MarkRajcok解决方案是一个好方法 评论 2016年4月29日8:05
1

只需记录:

回调参数上一条路线具有名为的属性$路线这与$路线服务。不幸的是当前路线参数没有关于当前路线的太多信息。

为了克服这个问题,我尝试了一些类似的方法。

$routeProvider。when('/'{控制器:。。。,templateUrl:“…”,routeName:“主页”}).when(“/menu”{控制器:。。。,templateUrl:“…”,routeName:“站点菜单”})

请注意,在上述路由配置中,有一个名为路由名称已添加。

app.run(函数($rootScope,$route){//在rootScope上绑定`$routeChangeSuccess`事件,这样我们就不需要//绑定各个控制器。$rootScope$on(“$routeChangeSuccess”,函数(currentRoute,previousRoute){//这将提供我们在配置路由时定义的自定义属性。console.log($route.current.routeName)})})
1
1

上述代码的修改:

$scope$on(“$locationChangeStart”,函数(evt,absNewUrl,absOldUrl){console.log('prev path:'+absOldUrl.$$route.originalPath);});
  • 1
    如果使用的是管线参数,则该修改无效。未填写的参数原始路径 评论 2014年3月18日16:49
  • 1
    $scope.on导致错误“$scope.on不是函数。”我认为您使用$scope$而是打开。
    – 孙顺
    评论 2014年3月29日4:37
  • 参数absOldUrl是上一个URL。 评论 2020年10月20日21:05

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.