Angular ui-router解决服务暂停路由更改

时间:2014-12-04 16:49:47

标签: javascript angularjs angular-ui-router

在允许切换到该状态之前,尝试让ui-router解析认证服务。

不幸的是,每当我注入一个不属于棱角分明的服务时,它会继续躲避我的角度。

我知道我无法将服务注入到.config中,但我确实应该可以在控制器加载之前完成它吗?

这是代码的缩减版本:

app.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {

// For any unmatched url, redirect to state:home
$urlRouterProvider.otherwise("/");
// Now set up the states
$stateProvider
    .state('home', {
        url: "/",
        templateUrl: "partials/home.html",
        resolve: {
            isAuthorised: ['$log', '$q', 'Auth', function ($log, $q, auth) {
                var q = $q.defer();
                $log.debug("checking if authorised..."); //this doesn't show
                if (auth.whatever()) {
                    q.resolve(true);
                } else {
                    q.reject(false);
                }

                return q.promise;
            }]
        },
        controller: "DefaultCtrl"
    });
}]);

因此控制器实际上从未实例化......控制台中没有错误。

如果我输入任何随机字符串作为服务名称,也会发生同样的情况...所以我最好的猜测是它无法找到它?但该应用程序的所有其他区域都可以......

我花了一段时间研究这个,我很确定我应该能够以某种方式完成这个。

任何帮助都会非常感激。

捐赠。

修改

感谢 Chris T 为Plunkr!我正在讨论这个问题,我添加了你的控制台日志,我收到了以下错误:

Start:   {} -> home{}

Error:   {} -> home{} ReferenceError: $window is not defined {stack: "ReferenceError: $window is not defined↵    at a (h…pm/planitmoney/claw/dist/js/bower.min.js:815:112)", message: "$window is not defined"}

bower.min.js文件只是有角度的,后跟UI路由器..我要做更多的检查。再次感谢。

2 个答案:

答案 0 :(得分:2)

再次感谢创建Plunkr的Chris T http://plnkr.co/edit/aeEt4ddUYMM3xRi8M38T?p=preview 这有助于解决问题。

我将他在那里的控制台日志复制到我的应用程序中:

// Adds state change hooks; logs to console.
app.run(function($rootScope, $state) {
$rootScope.$state = $state;
function message(to, toP, from, fromP) { return from.name  + angular.toJson(fromP) + " -> " +     to.name + angular.toJson(toP); }
$rootScope.$on("$stateChangeStart", function(evt, to, toP, from, fromP) { console.log("Start:   " + message(to, toP, from, fromP)); });
$rootScope.$on("$stateChangeSuccess", function(evt, to, toP, from, fromP) { console.log("Success: " + message(to, toP, from, fromP)); });
$rootScope.$on("$stateChangeError", function(evt, to, toP, from, fromP, err) {     console.log("Error:   " + message(to, toP, from, fromP), err); });
}); 

我立即注意到错误:

Start:   {} -> home{}

Error:   {} -> home{} ReferenceError: $window is not defined {stack: "ReferenceError: $window is not defined↵    at a (h…pm/planitmoney/claw/dist/js/bower.min.js:815:112)", message: "$window is not defined"}

深入挖掘我将错误追溯到实际抛出的错误,并在几分钟后修复。

我试图解决的服务也调用了它自己的一些依赖项。我不知道其中一个服务中缺少$ window注入。

错误未显示在控制台中 我想这可能是因为它被访问的独特方式(使用ui-routers解析)或者我在应用程序中使用Raven将它扔到某个我没看到的地方。

我希望这可以帮助其他人找到问题的根源。

再次感谢大家。

答案 1 :(得分:0)

我们有一个类似的设置,可以检查localStorage是否有令牌并解析了这个承诺。

检查以下示例:

var requireUser = { User: [ "$location", "$rootScope", "$q", "API", "Session",
    function ( $location, $rootScope, $q, API, Session )
    {
        var deferred = $q.defer();

            if( Session.get.authToken() )
            {
                if( Session.get.user() )
                {
                    deferred.resolve( $rootScope.user );
                }
                else
                {
                    $location.path( "/login" );
                }
            }
            else
            {
                deferred.reject( "No user token" );
                $location.path( "/login" );
            }

        return deferred.promise;

    } ] };

$routeProvider
    .when( "/users", { templateUrl: "/build/templates/users.html", controller: "UsersCtrl", resolve: requireUser, active: "users" } )