我尽了一切努力,但似乎没有直接的方法可以访问前一个路线的内部路径$routeProvider https://docs.angularjs.org/api/ngRoute/provider/%24routeProvider's resolve
财产。
只是为了好玩,我实现了一个具有以下属性的(极其复杂的)解决方案:
- 仅当以下情况时,它才会检测先前的路线:
/trash
视图已加载(并非针对每条路线)。
- 它不必了解其余路线的任何信息。
- 添加额外路由时不需要额外配置(这会增加实现复杂性,但简化维护)。
In words
以下是它的工作原理:
In the resolve
对象,它为下一个对象注册一个侦听器$routeChangeSuccess
event.
捕获事件后,它会取消注册侦听器。
一旦监听器被取消注册,它就会解析一个带有前一个路由路径值的承诺。
注入的对象trashCtrl
(来自resolve
property) 是一个函数,它返回上述承诺。
控制器接收该函数,调用它来获取 Promise,并等待 Promise 通过先前路由的路径得到解析。
简单如馅饼!
Note:
For the sake of "simplicity" I haven't taken into account the posibility of an error leading to $routeChangeError
(instead of $routeChangeSuccess
). One should probably take that into account and deregister the listeners, but even if you don't, there will be no harm - the listener will leave on until the $routeChangeSuccess
is fired once.
The code
控制器:
app.controller('trashCtrl', function ($scope, prevRoutePromiseGetter) {
prevRoutePromiseGetter().then(function (prevRoute) {
$scope.prevRoute = prevRoute || 'nowhere';
});
});
The resolve
object:
resolve: {
prevRoutePromiseGetter: function ($q, $rootScope) {
var deferred = $q.defer();
var dereg = $rootScope.$on('$routeChangeSuccess',
function(evt, next, prev) {
dereg();
deferred.resolve((prev.originalPath || '').substr(1));
}
);
return function () {
return deferred.promise;
};
}
}
另请参阅此简短的演示 http://jsfiddle.net/ExpertSystem/tKEs2/.