Angular Typescript, расширяющий класс частными объявлениями сервиса - PullRequest
0 голосов
/ 15 января 2020
  • У меня есть страница (Компонент).
  • В коде этой страницы я делаю объект класса B; когда я это делаю, я хочу передать ему некоторые свойства для его инициализации (флаг редактирования, ID и т. д. c.)
  • Класс B расширяет класс A.
  • Оба класс A и класс B нуждаются в некоторых службах, таких как MatSnackBar, AuthService и некоторых службах данных.

  • для добавления служб в класс вы объявляете их как частные в конструкторе (вы видите, куда я иду с этим?)

ВОПРОС: Как передать параметры в класс B, которые затем будут переданы в класс A?

обычно в классе A, я бы объявил конструктор - я добавил опционально к своим службам, чтобы мне не приходилось их передавать?

export Class A { 
constructor(id: number, editFlag: boolean, 
@Optional() private snackBar: MatSnackBar, @Optional() private auth: AuthService, @Optional private dataService: DataService, etc...) 

, что делает кажется, работает ...

Но затем в классе B, мне нужно объявить аналогичный конструктор:

export Class B extends A { 
    constructor(id: number, editFlag: boolean,  
        @Optional() private snackBar: MatSnackBar, @Optional() private auth: AuthService, @Optional 
        private dataService: DataService, etc...) 
    {
        super(id, editFlag);
    }
}

Изначально он не работал. Мне нужно было объявить закрытые параметры защищенными, чтобы заставить его скомпилироваться, и мне пришлось вызвать super(id, editFlag, snackBar, auth, ...) и ... это тоже не работает, так как объекты, кажется, не передаются.

Есть ли другой способ объявить мои частные сервисы, или есть другой способ передать параметры? Или мне нужно сделать set / get методы для установки параметров и запуска вещей, которые должны происходить на их основе?

1 Ответ

0 голосов
/ 15 января 2020

Я думаю, что у меня это есть.

В базовом классе я сделал protected членов для хранения сервисов, которые я хочу передать. Я передаю их в экземпляр класса B, и затем оттуда до super(); защищенный статус переменных-членов позволяет наследникам, но не посторонним использовать их.

Я создаю экземпляр объекта со своей страницы следующим образом:

this.myB = new B(anId, true, snackBar, auth, strService, logger);

и в классе B


  constructor(idReview: number, editing: boolean, snackBar: MatSnackBar,
              auth: AuthService,  strService: StrService, logger: LoggerService) {
    super(idReview, editing, snackBar, auth, strService, logger);

и декларация класса A

export class A extends UnsubscribeOnDestroyAdapter{
  id: number;
  editing: boolean = false;

  protected snackBar: MatSnackBar;

  protected auth: AuthService;
  protected strService: StrService;
  protected logger: LoggerService ;

  constructor(idReview: number, editing: boolean, snackBar: MatSnackBar,
               auth: AuthService,  strService: StrService,
               logger: LoggerService) {
    super();

    this.id = idReview;
    this.editing = editing;
    this.snackBar = snackBar;

    this.auth = auth;
    this.strService = strService;
    this.logger = logger;
}

Работает!

Спасибо Алену Шотару за идею решения!

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