angularjs获得之前的路线path
<h1>{{header}}</h1> <!-- This Back button has multiple option --> <!-- In home page it will show menu --> <!-- In other views it will show back link --> <a ng-href="{{back.url}}">{{back.text}}</a> <div ng-view></div>
在我的模块configuration
$routeProvider. when('/', { controller:HomeCtrl, templateUrl:'home.html' }). when('/menu', { controller:MenuCtrl, templateUrl:'menu.html' }). when('/items', { controller:ItemsCtrl, templateUrl:'items.html' }). otherwise({ redirectto:'/' });
控制器
function HomeCtrl($scope, $rootScope){ $rootScope.header = "Home"; $rootScope.back = {url:'#/menu', text:'Menu'}; } function MenuCtrl($scope, $rootScope){ $rootScope.header = "Menu"; $rootScope.back = {url:'#/', text:'Back'}; } function ItemsCtrl($scope, $rootScope){ $rootScope.header = "Items"; $rootScope.back = {url:'#/', text:'Back'}; }
正如你可以在我的控制器中看到的,我已经硬编码了后退button的URL和文本(其实我不需要文本作为使用图像)。 通过这种方式,我发现后退button在某些情况下导航不正确。 我不能使用history.back()
因为我的后退button改变到主视图中的菜单链接。
所以我的问题是如何获得控制器中的以前的路线path或更好的方法来实现这一目标?
我创build了一个Plunker示范我的问题。 请检查一下。
这个替代scheme也提供了一个后台function
模板:
<a ng-click='back()'>Back</a>
模块:
myModule.run(function ($rootScope, $location) { var history = []; $rootScope.$on('$routeChangeSuccess', function() { history.push($location.$$path); }); $rootScope.back = function () { var prevUrl = history.length > 1 ? history.splice(-2)[0] : "/"; $location.path(prevUrl); }; });
使用$ locationChangeStart或$ locationChangeSuccess事件 ,第三个参数:
$scope.$on('$locationChangeStart',function(evt, absNewUrl, absOldUrl) { console.log('start', evt, absNewUrl, absOldUrl); }); $scope.$on('$locationChangeSuccess',function(evt, absNewUrl, absOldUrl) { console.log('success', evt, absNewUrl, absOldUrl); });
在你的html:
<a href="javascript:void(0);" ng-click="go_back()">Go Back</a>
在你的主控制器上:
$scope.go_back = function() { $window.history.back(); };
当用户点击返回链接时,控制器function被调用,它将回到以前的路由。
@andresh对于我locationChangeSuccess工作,而不是routeChangeSuccess。
//Go back to the previous stage with this back() call var history = []; $rootScope.$on('$locationChangeSuccess', function() { history.push($location.$$path); }); $rootScope.back = function () { var prevUrl = history.length > 1 ? history.splice(-2)[0] : "/"; $location.path(prevUrl); history = []; //Delete history array after going back };
这是我现在如何在$rootScope
存储对前一个path的引用:
run(['$rootScope', function($rootScope) { $rootScope.$on('$locationChangeStart', function() { $rootScope.previousPage = location.pathname; }); }]);
您需要将事件侦听器耦合到Angular 1.x中的$ rootScope,但是您应该将来可以通过不在$ rootScope中存储上一个位置的值来validation您的代码。 存储价值的更好的地方是服务:
var app = angular.module('myApp', []) .service('locationHistoryService', function(){ return { previousLocation: null, store: function(location){ this.previousLocation = location; }, get: function(){ return this.previousLocation; } }) .run(['$rootScope', 'locationHistoryService', function($location, locationHistoryService){ $rootScope.$on('$locationChangeSuccess', function(e, newLocation, oldLocation){ locationHistoryService.store(oldLocation); }); }]);
只是为了logging:
callback参数previousRoute
有一个名为$route
的属性,它非常类似于$route
服务。 不幸的是currentRoute
论点,并没有太多关于当前路线的信息。
为了克服这个,我尝试了一些这样的事情。
$routeProvider. when('/', { controller:..., templateUrl:'...', routeName:"Home" }). when('/menu', { controller:..., templateUrl:'...', routeName:"Site Menu" })
请注意在上面的路由configuration中添加了一个名为routeName
的自定义属性。
app.run(function($rootScope, $route){ //Bind the `$routeChangeSuccess` event on the rootScope, so that we dont need to //bind in induvidual controllers. $rootScope.$on('$routeChangeSuccess', function(currentRoute, previousRoute) { //This will give the custom property that we have defined while configuring the routes. console.log($route.current.routeName) }) })
修改上面的代码:
$scope.$on('$locationChangeStart',function(evt, absNewUrl, absOldUrl) { console.log('prev path: ' + absOldUrl.$$route.originalPath); });