Angular 6 Services и наследование классов - PullRequest
0 голосов
/ 10 мая 2018

В Angular 6 теперь есть поставщиков для инъекций , что является новым рекомендуемым способом ввода услуг, и он работает очень хорошо, за исключением того, что у меня возникают проблемы при использовании службы, которая расширяет другую службу. В качестве примера предположим, что у меня есть

@Injectable({
  providedIn: 'root'
})
export class ParentAppService { ... }

@Injectable({
  providedIn: 'root'
})
export class ChildAppService extends ParentAppService { ... }

Проблема в том, что независимо от того, что я запрашиваю в компоненте, родительский класс всегда внедряется.

Так что, если вы попросите

constructor(private childAppService: ChildAppService) { ... }

вам все равно будет предоставлен экземпляр ParentAppService, который не ожидается.

Очень простой обходной путь - просто зарегистрировать провайдеров в вашем модуле по старинке, и это работает:

@NgModule({
 providers: [AppService, ChildAppService]
})

Но это, в основном, старый способ ведения дел, и он не имеет преимуществ, связанных с улучшением процесса встряхивания деревьев и более чистого тестирования, как, например, новый процесс регистрации, предоставляемый при регистрации.

Итак, мой вопрос: как правильно это сделать? Есть ли лучший способ зарегистрировать провайдера, чтобы я мог получить желаемое поведение (может быть, указать маркер провайдера как-нибудь?).

Я установил супер простой пример стекаблица, чтобы показать, что происходит.

https://stackblitz.com/edit/angular-lacyab?file=src%2Fapp%2Fapp.component.ts

Вы заметите, что там написано "Здравствуйте, Я СЕРВИС ПРИЛОЖЕНИЯ!" хотя компонент попросил предоставить дочерний сервис. Если в модуле приложения мы регистрируем провайдеров по-старому (см. Закомментированный код), внезапно вводится правильный провайдер.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 10 мая 2018

Обновление:

Для этого уже есть запрос на извлечение https://github.com/angular/angular/pull/25033

Оригинальная версия

Проблема: кажется, что новые угловые сервисы treehakable не уважают наследование:

enter image description here

Первый угол определяет ( 1 ) ngInjectableDef свойство в функции AppService. Затем вы наследуете ChilAppService от AppService, так что дочерний класс содержит все свойства родительского класса. И, наконец, когда angular пытается определить ( 2 ) ngInjectableDef свойство для ChildAppService, оно не может, потому что оно уже существует ( 3 ) благодаря прототипическому наследованию javascript.

enter image description here

Чтобы исправить это, вы можете

1) Обойти это, задав неопределенное свойство ngInjectableDef в дочернем сервисе, чтобы оно не считывало уже заполненное свойство родительского класса, а angular сможет определить ngInjectableDef в дочернем классе:

<code>@Injectable({
  providedIn: 'root'
})
export class ChildAppService extends AppService {
  <b>static ngInjectableDef = undefined;</b>
  constructor() {
    super();
    this.name = 'CHILD SERVICE';
  }
}

Разветвленный стек стека

2) или сообщите о проблеме в github

3) или используйте композицию вместо наследования, как было предложено в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...