Подтвердить что ты не робот

AngularJS - routeProvider разрешает вызов метода услуги

Я создал службу, которая проверяет состояние входа пользователя (регистрирует пользователя, если существует токен, в противном случае перенаправляется на страницу входа).

Изначально я вызывал эту службу через решение routeProvider - это работает отлично один раз, но поскольку службы Angularjs однотонные, тест не будет выполняться для последовательных вызовов.

Затем я попытался перенести тест в метод в возвращаемом объекте, но я не могу показаться, что вы хотите, чтобы решение routeProvider вызывало конкретный метод службы (что имеет смысл в некотором роде).

Вопрос: как я могу убедиться, что мой тест выполняется каждый раз, когда маршрут загружен?

В серии видеороликов с яйцами (http://www.egghead.io/video/rbqRJQZBF3Q) он использует функцию, назначенную контроллеру, но это не похоже на правильное решение для производственного приложения ( Я не хочу назначать функцию определенному контроллеру, и я уверен, что инъекция зависимостей Angularjs не будет работать).

4b9b3361

Ответ 1

службы являются однотоновыми средствами, поскольку они инициализируются только одним, но временем, но если вы просто возвращаетесь из службы, это будет вызвано один раз, но если вы вернете функцию из службы, она будет вызываться снова и снова. См. ниже Пример для работы

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');
        }
    };
});

Ответ 2

Добавляя к ответу @Ajay, вы можете использовать строку, а не стандартное имя свойства, что поможет с минимизацией:

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