AngularJS /强制解析属性随时运行

时间:2013-10-29 13:11:17

标签: javascript angularjs

正如大多数角度开发人员所知,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方法完成的...... 如果可以强制进行评估,那就太棒了。

2 个答案:

答案 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);

像魅力一样。