Как остановить ngOnChanges Вызывается перед ngOnInit()

В моем приложении angular я столкнулся с ситуацией, когда ngOnchanges следует вызывать только тогда, когда входы связаны с изменениями. так, есть ли способ остановить выполнение ngOnChanges перед ngOnInit. Есть ли способ сделать это. Спасибо в Advance.

Ответ 1

Вы не можете предотвратить это поведение, но вы можете:

Используйте тему:

class Foo implements OnChanges,OnInit{

  onChanges = new Subject<SimpleChanges>();

  ngOnInit(){
    this.onChanges.subscribe((data:SimpleChanges)=>{
      // only when inited
    });
  }

  ngOnChanges(changes:SimpleChanges){
    this.onChanges.next(changes);
  }

}

Используйте логическое свойство:

class Foo implements OnChanges,OnInit{

  initialized=false;

  ngOnInit(){
    // do stuff
    this.initialized = true;
  }

  ngOnChanges(changes:SimpleChanges){
    if(this.initialized){
      // do stuff when ngOnInit has been called
    }
  }

}

Используйте API SimpleChanges

Вы также можете проверить метод SimpleChange.isFirstChange():

isFirstChange(): boolean Проверить, является ли новое значение первым назначенным значением.

class Foo implements OnChanges,OnInit{

  @Input()
  bar:any;

  ngOnInit(){
    // do stuff
  }

  ngOnChanges(changes:SimpleChanges){
    if(!changes["bar"].isFirstChange()){
      // do stuff if this is not the initialization of "bar"
    }
  }

}

Ответ 2

Я предполагаю, что это не то, что ищет OP, но следующее предоставляет способ избавиться от вызова ngOnChanges() без каких-либо изменений в коде вашего компонента.

Вместо того, чтобы объявлять ваш компонент с соответствующим селектором в вашем шаблоне, вы могли бы вместо этого иметь шаблон ng:

<ng-template></ng-template>

А затем создайте свой компонент внутри этого ng-шаблона, используя метод ViewContainerRef # createComponent.

Таким образом, ваш компонент будет создан без какого-либо ввода, и ngOnChanges() больше не будет вызываться до ngOnInit().