Доступ к сервису в хуке @CanActivate

Я не могу найти способ получить доступ к службе и правильно настроить ее зависимости, когда доступ к этой службе осуществляется из хука @CanActivate Angular.

Перед созданием экземпляра компонента мне нужно сначала проверить, что пользователь аутентифицирован. Мой крючок выглядит так:

import {AuthenticationService} from '../authentication/authentication.service';

.................

@CanActivate((next, prev) => {
  var injector = Injector.resolveAndCreate([
    AuthenticationService
  ])

  var authService = injector.get(AuthenticationService);

  return authService.getUser();
})

export class ShellComponent { }

Я получаю ошибку EXCEPTION: No provider for Http! (AuthenticationService -> Http). Следует отметить, что HTTP_PROVIDERS вводятся при начальной загрузке приложения.

Моя служба аутентификации выглядит следующим образом:

import {Injectable} from 'angular2/core';
import {Http} from 'angular2/http';

@Injectable()
export class AuthenticationService {

  constructor(private _http:Http) {}

  getUser() {
    var resolver = function(resolve, reject) {
        setTimeout(function doneCounting() {
            resolve(true);
        }, 5000);
    }

    return new Promise<Boolean>(resolver);
  }
}

Любая помощь или понимание будут оценены.


person garethdn    schedule 27.12.2015    source источник
comment
В вашем корневом компоненте вам, возможно, придется указать providers ?   -  person Avijit Gupta    schedule 27.12.2015


Ответы (1)


Все, что вам нужно, это добавить эти зависимости в resolveAndCreate, поэтому ваш код будет:

 var injector = Injector.resolveAndCreate([HTTP_PROVIDERS, AuthenticationService])
person Vlado Tesanovic    schedule 27.12.2015
comment
Это работает, спасибо. Можете ли вы объяснить, почему, учитывая, что я уже внедрил HTTP_PROVIDERS при начальной загрузке, я думал, что HTTP_PROVIDERS тогда будет доступно для всего приложения? - person garethdn; 27.12.2015
comment
Да, но если вы создаете такой экземпляр класса с помощью Injector, вы должны предоставить его в массиве. Поскольку вы внедряете Http в конструктор AuthenticationService, вы должны предоставить его провайдеров во время создания объекта. - person Vlado Tesanovic; 27.12.2015
comment
Я полагаю, что, поскольку вы создаете новый инжектор с помощью статического метода resolveAndCreate, этот инжектор не является частью иерархии инжекторов, которую Angular создает при начальной загрузке приложения и создании компонента. Следовательно, нам нужно снова зарегистрировать зависимость с помощью инжектора. - person Chandermani; 28.12.2015