AngularJS - routeProvider解析调用服务方法

时间:2013-05-23 10:33:16

标签: javascript angularjs

我已经创建了一个检查用户登录状态的服务(如果令牌存在则记录用户,否则重定向到登录页面。)

最初我通过routeProvider解析调用了这个服务 - 这个工作完美一次,但由于Angularjs服务是单例,因此连续调用不会运行测试。

然后我尝试将测试移动到返回对象中的方法中,但似乎无法让routeProvider解析调用服务的特定方法(这在某种程度上是有意义的)。< / p>

问题是,如何确保每次加载路线时都执行我的测试?

在egghead视频系列(http://www.egghead.io/video/rbqRJQZBF3Q)中,他使用分配给控制器的功能,但这似乎不是生产应用程序的正确解决方案(我不想将功能分配给特定的控制器,我相信Angularjs依赖注入不起作用。)

2 个答案:

答案 0 :(得分:27)

服务是单件意味着只有一个但是时间初始化但是如果你只是从服务返回它将被调用一次,但如果你从服务返回一个函数,它将被一次又一次地调用。见下面的样本工作

var app = angular.module('ajay.singhApp', [])
  .config(['$routeProvider', function($routeProvider) {
    $routeProvider
      .when('/view1', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl',
        resolve: {
            myVar: function (repoService) {
                return repoService.getItems().then(function (response) {
                    return response.data;
                });
            }
        }
      })
        .when('/view2', {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        })
      .otherwise({
        redirectTo: '/view1'
      });
  }]);


app.factory('repoService', function ($http) {
    return {
        getItems: function () {
            return $http.get('TextFile.txt');
        }
    };
});

答案 1 :(得分:1)

添加到@ Ajay的响应,您可以使用字符串而不是标准属性名称,这将有助于缩小:

resolve: {
    'myVar': function (repoService) {
        return repoService.getItems().then(function (response) {
            return response.data;
        });
    }
}