Я не могу найти, как получить доступ к свойствам DI из дочернего класса - PullRequest
0 голосов
/ 08 мая 2020

Я реализовал этот подход в моем приложении angular, и вход / регистрация работают.

Теперь я использую sh, чтобы добавить функцию для запуска OnInit при инициализации моих компонентов регистрации / входа в систему.

В частности, я использую sh для использования / ввода

  1. MyService
  2. ActivatedRoute / ActivatedRouteSnapshot для доступа к параметрам URL-адресов двух компонентов.
  3. LocationStrategy

в мой дочерние компоненты (LoginComponent и RegistrationComponent), потому что все они являются производными от NbLoginComponent и NbRegisterComponent соответственно

Вот мой register.component.ts

export class NgxRegisterComponent extends NbRegisterComponent {}

Вот мой NbRegisterComponent

export declare class NbRegisterComponent {

    constructor(
        service: NbAuthService, 
        options: {}, 
        cd: ChangeDetectorRef, 
        router: Router);

    register(): void;

    getConfigValue(key: string): any;

    static ɵfac: ɵngcc0.ɵɵFactoryDef<NbRegisterComponent>;

    static ɵcmp: ɵngcc0.ɵɵComponentDefWithMeta<NbRegisterComponent, "nb-register", never, {}, {}, never>;
}

Я застрял в том, что не могу использовать Injector для NbRegisterComponent, потому что конструктор не принимает никаких свойств, а не аргументов.

Кроме того, я попытался объявить защищенные члены в NbRegisterComponent и добавить их в конструктор.

protected myService : MyService

Затем в дочернем классе RegisterComponent я добавил свойства в конструкторы и Super (). аргументы, но введенные свойства были нулевыми / неопределенными.

Любая помощь будет go долгим.

1 Ответ

0 голосов
/ 09 мая 2020

Хехехе,

В дочернем компоненте я добавил список поставщиков для всех необходимых объектов / свойств, например

@Component({
  //...
  providers: [
    {provide: VisitsService, useClass : VisitsService},
  ]
})

Здесь после в конструкторе дочернего компонента я добавил @Inject () функция

  constructor(
    @Inject(ActivatedRoute)activateRoute : ActivatedRoute,
    @Inject(VisitsService) protected visitService: VisitsService,    
  ){
    super(
      activateRoute, 
      visitService);
  }

Теперь все работает.

Ой! помните, что родительские компоненты также внедрили эти свойства в свой конструктор, и порядок аргументов имеет значение.

...