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);
});
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,在逻辑开始工作之前,我必须调用与该控制器对应的视图.控制器第一次触发时,不记录任何内容.此外,在此初始加载之后,应用程序将记录每个 routesChange,即使加载的视图不起作用TrashCtrl
我希望这样:
Trash(其控制器TrashCtrl)时,我需要先前的路由或空字符串(如果这是第一个).trash路线被调用时触发,而不是在每个路径变换上,那将是很好的.如何实现这一目标?
编辑:
请注意,我知道可以创建自定义服务并将每个更改写入其中.这不是我想要的.我想仅在需要时才对数据进行处理,例如只在Trash被调用时.
我尝试过我可以什么,但似乎没有直接的方式来获得进入内部之前的路线的路径$routeProvider的resolve属性.
为了好玩,我使用以下属性实现了一个(荒谬复杂的)解决方案:
/trash加载视图时检测先前的路径(不是针对每个路径).以下是"简单"字样的工作原理:
在resolve对象中,它为下一个$routeChangeSuccess事件注册一个监听器.
捕获事件后,它会取消注册侦听器.
一旦侦听器未注册,它就会解析具有前一路由路径值的promise.注入trashCtrl(来自resolve属性)的对象是一个函数,它返回前面提到的promise.
控制器接收该函数,调用它来获取承诺并等待承诺通过前一个路径的路径得到解决.
简单就像馅饼!
注意:
为了"简单",我没有考虑导致$routeChangeError(而不是$routeChangeSuccess)错误的可能性.人们应该考虑到这一点并取消注册听众,但即使你不这样做,也不会有任何伤害 - 听众会一直$routeChangeSuccess关闭直到被解雇.
控制器:
app.controller('trashCtrl', function ($scope, prevRoutePromiseGetter) {
prevRoutePromiseGetter().then(function (prevRoute) {
$scope.prevRoute = prevRoute || 'nowhere';
});
});
Run Code Online (Sandbox Code Playgroud)
该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;
};
}
}
Run Code Online (Sandbox Code Playgroud)
另见这个简短的演示.
| 归档时间: |
|
| 查看次数: |
5069 次 |
| 最近记录: |