Angular的内部结构让我感到困惑。
我需要确定加载特定视图时的上一个路线。
我就是这样做的
app.controller('TrashCtrl',function($scope,$rootScope){
$rootScope.$on('$locationChangeSuccess',function(evt, absNewUrl, absOldUrl) {
var hashIndex = absOldUrl.indexOf('#');
var oldRoute = absOldUrl.substr(hashIndex + 2);
console.log(oldRoute);
});
});
不幸的是,在逻辑开始工作之前,我必须调用与该控制器对应的视图一次。控制器第一次触发时,不记录任何内容。此外,在此初始加载后,应用程序将记录每个 routeChange,即使加载的视图不适用于TrashCtrl
我想这样:
Trash
(其控制器为TrashCtrl
)时,我需要先前的路径或空字符串(如果这是第一个)。trash
路由时触发,而不是在每个路径更改时触发,那将是很好的。如何实现这一目标?
编辑:
请注意,我知道可以创建自定义服务并将每个更改写入其中。这不是我想要的。我想仅在需要时才计算数据,例如只在调用Trash
时。
答案 0 :(得分:7)
我尽我所能,但似乎没有直接的方法可以访问 $routeProvider
的resolve
属性中的上一条路径。
为了好玩,我使用以下属性实现了一个(荒谬复杂的)解决方案:
/trash
视图时才检测到上一个路径(不是每个路径都有)。以下是“简单”字样的工作原理:
在resolve
对象中,它会为下一个$routeChangeSuccess
事件注册一个侦听器
捕获事件后,它会取消注册监听器
一旦侦听器未注册,它就会解析具有前一路径路径值的promise。
注入trashCtrl
(来自resolve
属性)的对象是一个函数,它返回上述承诺。
控制器接收该函数,调用它来获取承诺,并等待承诺通过前一个路径的路径得到解决。
简单就像馅饼一样!
<子>
注意:强>
为了“简单”,我没有考虑导致$routeChangeError
(而不是$routeChangeSuccess
)的错误的可能性。人们应该考虑到这一点并取消注册听众,但即使你不这样做,也不会有任何伤害 - 听众会在$routeChangeSuccess
被解雇一次之前离开。
子>
控制器:
app.controller('trashCtrl', function ($scope, prevRoutePromiseGetter) {
prevRoutePromiseGetter().then(function (prevRoute) {
$scope.prevRoute = prevRoute || 'nowhere';
});
});
resolve
对象:
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;
};
}
}
另请参阅此 short demo 。
答案 1 :(得分:-1)
您需要使用$ routeChangeStart而不是位置更改。
$rootScope.$on('$routeChangeStart', function(event, next, current) {
});