Переопределить дочерний метод ngOnInit - PullRequest
0 голосов
/ 02 октября 2018

Я хочу добавить код в дочерний метод ngOnInit из родительского класса.Можно ли как-то сделать что-то похожее на это?

export class Child extends Parent {
   constructor(){
      super(this.ngOnInit);
   }
   ngOnInit(){
      console.log('Child onInit');
   }
}

И Parent:

export class Parent {
   constructor(childOnInitMethod: any){}
   ngOnInit(){
      console.log('Parent added code to child onInit');
      this.childOnInitMethod.apply(this, arguments)
   }
}

Проблема в том, что на дочернем конструкторе у меня нет доступного "this".

ОБНОВЛЕНИЕ: Найдите здесь текущий код

Пока что это то, что я сделал.Дочерний класс расширяет родительские ngOnInit и ngOnDestroy.Чего я хочу добиться, так это избегать вызова родительского "super.subscribeEvents ();"вот так:

ngOnInit() {
   window.onresize = () => console.log('resizing');
   super.subscribeEvents();
}

Что я хочу сделать, так это добавить код в ngOnInit дочернего элемента родительского элемента.Это классы:

export class DatatablePage extends EventSubscriber {
   @Output() onLoadRow: EventEmitter<any> = new EventEmitter();
   public gridApi: GridApi;
   constructor(
    events: Events
   ) {
    super(events, [
        { eventName: 'datatable:updateList', callbackFunction: () => this.onLoadRow.emit() },
        { eventName: 'datatable:resizeTable', callbackFunction: () => this.gridApi.sizeColumnsToFit() }
    ])
   }

   ngOnInit() {
       window.onresize = () => console.log('resizing');
       super.subscribeEvents();
   }
}

И Parent:

export class EventSubscriber {


constructor(
    private events: Events,
    public eventSubscriptions: EventObject[]
) {
}

ngOnInit() {
    this.subscribeEvents();
}

ngOnDestroy() {
    this.unsubscribeEvents();
}

subscribeEvents() {
    this.eventSubscriptions.forEach((eventSubscription: EventObject) => {
        this.events.subscribe((eventSubscription.eventName), eventSubscription.callbackFunction)
    });
}

unsubscribeEvents() {
    this.eventSubscriptions.forEach((eventSubscription: EventObject) => {
        this.events.unsubscribe((eventSubscription.eventName), eventSubscription.callbackFunction)
    });
}
}

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Чтобы вызвать методы вашего ребенка, вам нужно добавить его в .component вашего родителя следующим образом:

@ViewChild(Child) child: Child;

После того, как ваш родитель и ребенок инстанцированы, вы можете использовать this.child.anyFunction();

Альтернативой является использование @Input для вашего ребенка, например:

@Input() test: number;

Вид родителей должен выглядеть следующим образом:

<child [test]="example"></child>

Пока вы определяете переменную в вашем компоненте:

example: number;

ngOnInit() {
    this.example = 1;
}

Также обратите внимание на ngOnChanges.

0 голосов
/ 02 октября 2018

нижеприведенное решение должно работать.

class Parent {
   constructor(){}
   ngOnInit(){
      console.log('Parent added code to child onInit');
      this.ngOnInit()
   }
}

class Child extends Parent {
    ngOnInit() {
      console.log('Child onInit');
    }
    invokeSuperOnInit() { 
        super.ngOnInit();
    }
}

const a = new Child();
a.invokeSuperOnInit();

Исполнение:

  1. Создан объект дочернего класса и присвоен.

  2. вызов метода invokeSuperOnInit для объекта a.

  3. ngOnInit родительского объекта вызывается.

  4. в родительском NgOninitМы называем ngOnInit of the Child.Child ngOnInit вызывается, потому что «this» всегда будет оставаться неизменным во всей иерархии.

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