为什么路由不接受angularjs中的正常条件检查代码

时间:2014-05-29 04:05:29

标签: angularjs angular-routing

我想在页面加载之前检查一些条件,所以我使用了resolve属性 如

 when('/home', { templateUrl: 'views/home.html', controller: 'homeController',resolve: {
            user: function () {
                if (localStorage.getItem('FBUserData') === null) {

                    $location.url('/login');
                }
            }()
        }}).

但这不起作用,因为它显示的错误如下:

错误:[ng:areq]参数' fn'不是一个功能,未定义 ' 所以我将函数移动到控制器并尝试从那里调用,但这给出了不同的错误:

修改后的代码

 var angAuth = angular.module('angularAuthApp'[...]);
    angAuth.config(function ($routeProvider, $locationProvider) {
        $routeProvider.
            when('/home', { templateUrl: 'views/home.html', controller: 'homeController',resolve:homeController.checkUserFBSession})
    ....
    ....
    });

在homeController中:

angAuth.controller('homeController', function ($scope, $location) {    
    $scope.checkUserFBSession = function(){
      if(localStorage.getItem('FBUserData') === null){
          $location.url('/login');
      }
    };

...
});

在添加 resolve:homeController.checkUserFBSession 之后,我收到的错误如

由于以下原因无法实例化angularAuthApp模块:未定义homeController

1 个答案:

答案 0 :(得分:0)

原因是resolve的值是“应该注入控制器的可选依赖关系映射。如果这些依赖关系中的任何一个是promise,路由器将等待它们全部成为在实例化控制器之前解决或拒绝一个。“

这意味着{/ 1}}需要在实例化控制器之前进行评估。因此,您无法使用控制器中定义的函数来评估user


你的第一种方法应该工作思考(如果正确实施)。

user键值映射,其中resolve是注入控制器的依赖项的名称,key是字符串(表示)服务的名称)或功能。该函数由Angular调用,但在您的情况下,您自己调用它并返回undefined,因此Angular看到未定义的函数或字符串。

你应该改变这个:

value

到那个:

user: function () {...}()

注意:为了使用user: function ($location) {...} ,您还需要将其注入函数。


另请参阅此 short demo