20

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

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

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

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

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

4

2 回答 2

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');
        }
    };
});
于 2013-05-23T10:51:26.973 回答
1

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

resolve: {
    'myVar': function (repoService) {
        return repoService.getItems().then(function (response) {
            return response.data;
        });
    }
}
于 2014-06-16T15:58:11.680 回答