web-dev-qa-db-ja.com

前のルートパスを取得するanglejs

<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 私の問題のデモンストレーションを作成しました。確認してください。

49
Gihan

この代替手段は、バック機能も提供します。

テンプレート:

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

});
74
andersh

$ locationChangeStartまたは$ locationChangeSuccessイベント 、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);
});
22
Mark Rajcok

あなたのhtmlで:

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

メインコントローラーで:

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

ユーザーが[戻る]リンクをクリックすると、コントローラー関数が呼び出され、前のルートに戻ります。

16
Mohd Jafar

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

これは私が現在$rootScopeに以前のパスへの参照を保存する方法です:

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

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

ただ文書化する:

コールバック引数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)
    })
})

上記のコードの変更:

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