В моем приложении angular я столкнулся с ситуацией, когда ngOnchanges следует вызывать только тогда, когда входы связаны с изменениями. так, есть ли способ остановить выполнение ngOnChanges перед ngOnInit. Есть ли способ сделать это. Спасибо в Advance.
Как остановить ngOnChanges Вызывается перед ngOnInit()
Ответ 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().