<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 私の問題のデモンストレーションを作成しました。確認してください。
この代替手段は、バック機能も提供します。
テンプレート:
<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イベント 、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);
});
あなたのhtmlで:
<a href="javascript:void(0);" ng-click="go_back()">Go Back</a>
メインコントローラーで:
$scope.go_back = function() {
$window.history.back();
};
ユーザーが[戻る]リンクをクリックすると、コントローラー関数が呼び出され、前のルートに戻ります。
@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
に以前のパスへの参照を保存する方法です:
run(['$rootScope', function($rootScope) {
$rootScope.$on('$locationChangeStart', function() {
$rootScope.previousPage = location.pathname;
});
}]);
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);
});
}]);
ただ文書化する:
コールバック引数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);
});