正如大多数角度开发人员所知,Resolve属性允许保护对某些页面的访问。
以下是代码段代码的简短示例:
.config(['$routeProvider', 'securityAuthorizationProvider',
function ($routeProvider, securityAuthorizationProvider) {
$routeProvider.when('/test', {
templateUrl: '/myCorrespondingView.tpl.html',
controller: 'MyCorrespondingCtrl',
resolve: securityAuthorizationProvider.requireAuthenticatedUser
});
}])
我们假设一个页面包含一个名为“点击此处访问受保护页面”的链接(在引擎盖下制作$location.path("/test")
)。
期望是:当我点击它时,将resolve
设为rejected
并且......不要重定向到来电者页面以外的任何其他页面。
这导致......没有(用户无法访问页面的简单事实就足够了)但URL已更改为目标受保护页面。
=> myApp.com/test
(为什么Angular只有在成功的承诺结果的情况下才会进行此替换?:(,但这是我刚才提出的另一个问题:AngularJS / Changing the URL only when corresponding template's resolve property is solved)。
然后......再次点击......
似乎resolve
仍然没有再次处理。
然后...点击应用程序上的其他链接(当然没有完全重定向),无论您想要哪个更改URL,然后重新点击受保护的链接=> Resolve
会再次得到很好的处理。
是否有Angular机制检查当前页面URL和所需页面URL,如果两者都相同,则避免重新处理resolve
任务?
即使网址已经与目标网页1对应,我也想强制resolve
进程。
**更新******** 来自这篇文章:https://stackoverflow.com/a/12429133/985949
Angular监视位置变化(是否已完成 通过在位置栏中键入,单击链接或设置 通过$ location.path())的位置。 当感知到此更改时,它 $广播一个事件,“$ locationChangeSuccess”,并开始路由 过程
听起来我上面假设的检查确实是通过$location.path
方法完成的......
如果可以强制进行评估,那就太棒了。
答案 0 :(得分:3)
角度路由响应URL中的更改,而不是点击。如果浏览器中的位置没有变化,则角度根本不会拾取。
您应该做的是创建一个侦听“$ locationChangeSuccess”并跟踪上一个成功路由的服务。然后在$ routeChangeError上有另一个监听器,它将位置重置为失败时的最后一条成功路由。这样可以防止您处于位置与当前活动路径不匹配的不一致状态。
一旦你这样做,再次点击该链接会导致浏览器再次尝试更改位置,从而再次触发你的解析。
答案 1 :(得分:0)
我发现这post确认了@dtabuenc的解决方案。 这是我的:
angular.module('services.locationChanger', [])
.service('locationChanger', ['$location', '$route', '$rootScope', function ($location, $route, $rootScope) {
this.skipReload = function () {
var lastRoute = $route.current;
$rootScope.$on('$locationChangeSuccess', function () {
$route.current = lastRoute;
});
return this;
};
this.withoutRefresh = function (url, doesReplace) {
if(doesReplace){
$location.path(url).replace();
}
else {
$location.path(url || '/');
}
};
}]);
resolve
流程部分中的所有来电者都是:
locationChanger.skipReload().withoutRefresh("/", true);
像魅力一样。