angularjs获得以前的路线路径

时间:2013-03-02 14:09:42

标签: angularjs angularjs-routing

<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>

在我的模块配置

  $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'};
}

正如您在我的控制器中看到的,我已经对后退按钮URL和文本进行了硬编码(实际上我不需要将文本用作图像)。通过这种方式,我发现在某些情况下后退按钮导航不正确。我无法使用history.back()将我的后退按钮更改为主视图中的菜单链接。

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

我已经创建了Plunker我的问题演示。请检查一下。

8 个答案:

答案 0 :(得分:71)

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

模板:

<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);
    };

});

答案 1 :(得分:22)

使用$locationChangeStart or $locationChangeSuccess events,第3个参数:

$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);
});

答案 2 :(得分:15)

在你的HTML中

<a href="javascript:void(0);" ng-click="go_back()">Go Back</a>

在您的主控制器上:

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

当用户点击Go Back链接时,会调用控制器功能,它将返回上一个路径。

答案 3 :(得分:5)

@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
      };

答案 4 :(得分:4)

这就是我目前在$rootScope中存储对前一个路径的引用的方式:

run(['$rootScope', function($rootScope) {
        $rootScope.$on('$locationChangeStart', function() {
            $rootScope.previousPage = location.pathname;
        });
}]);

答案 5 :(得分:4)

你需要在Angular 1.x中将事件监听器耦合到$ rootScope,但是你可能会通过不在$ rootScope上存储以前位置的值来证明你的代码。存储价值的更好地方是服务:

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);
    });
}]);

答案 6 :(得分:1)

只是记录:

回调参数previousRoute有一个名为$route的属性,它与$route服务非常相似。 不幸的是currentRoute参数,没有太多关于当前路线的信息。

为了克服这个问题,我尝试过这样的事情。

$routeProvider.
   when('/', {
    controller:...,
    templateUrl:'...',
    routeName:"Home"
  }).
  when('/menu', {
    controller:...,
    templateUrl:'...',
    routeName:"Site Menu"
  })

请注意,在上述路线配置中,添加了名为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)
    })
})

答案 7 :(得分:1)

修改上述代码:

$scope.$on('$locationChangeStart',function(evt, absNewUrl, absOldUrl) {
   console.log('prev path: ' + absOldUrl.$$route.originalPath);
});