Можно ли создать абстракцию компонента на Angular 2?
Я хочу создать AbstractComponent с начальным поведением, будучи в состоянии переопределить его на дочернем, когда это необходимо, возможно ли это? Это хорошая практика?
Должен выглядеть примерно так:
export abstract class AbstractComponent implements OnInit {
constructor(authService: AuthService, router: Router) {}
ngOnInit() {
if (authService.userNotLoggedInAnymore()) {
router.navigate(['Login']);
}
}
...
}
Ответы
Ответ 1
Да, просто расширьте этот класс с помощью реального @Component
и вызовите super()
в методах, которые вы переопределите, например ngOnInit. И вы также должны переопределить конструктор с, по крайней мере, теми же или более зависимостями в родительском объекте и передать их также с помощью super()
.
Ответ 2
В качестве альтернативы вы также можете обойтись без параметров конструктора в абстрактном классе вообще и объявить сервисы с помощью декоратора @Inject, тогда вам не нужно прикасаться к конструктору наследующего класса и вызывать супер (...) -method там:
import { Inject } from '@angular/core';
export abstract class AbstractComponent implements OnInit {
@Inject(AuthService) private authService: AuthService;
@Inject(Router) private router: Router;
ngOnInit() {
if (authService.userNotLoggedInAnymore()) {
router.navigate(['Login']);
}
}
...
}