Один вызов API Несколько раз в угловой

#angular

Вопрос:

 ngOnChanges(changes: SimpleChanges) {
  if(changes.formName){
  this.getFormConfigurations(this.formName); 
}

getFormConfigurations(formName): void {
console.log('Inside form call..');
 this.api.getForm(formName).subscribe((result)=>{
 }
}

In API

getForm(name): Observable<any> {
console.log("Inside..API")
return this.http<>....
}
 

Я использую этот подход для вызова api при изменении углового , как вывод в консоли

 Inside form call..
Inside..API
Inside form call..
Inside..API
Inside..API
Inside..API
 

Поскольку я вижу несколько запросов API по этому вопросу, как избежать ненужных вызовов API этого типа.

Ответ №1:

ngOnChanges будет вызываться каждый раз, когда вы formName будете изменены из родительского компонента, что приведет к нескольким подпискам. Если вы хотите вызвать свою функцию только один раз, вы можете использовать атрибут firstChange класса SimpleChange .

 ngOnChanges(changes: SimpleChanges) {
   if(changes.formName amp;amp; changes.formName.isFirstChange()){
    this.getFormConfigurations(this.formName); 
}
 

Ответ №2:

Крюк ngOnChanges жизненного цикла вызывается каждый раз, когда обнаруживается изменение значения свойства, связанного с данными. Кроме того, ngOnChanges это не то место, где вы должны подписываться, чтобы слушать изменения в вашем наблюдаемом.

Чтобы ограничить вызов API, вы можете сделать следующее,

  • Если указанная форма является template-driven form
 import { ViewChild } from '@angular/common'

@ViewChild('opportunityForm', { static: true }) ngForm: NgForm;

ngOnInit() {
  this.changesInForm = this.ngForm.form.valueChanges.subscribe(x => {
    // Invoke call to injectable
  })
}

ngOnDestroy() {
   this.changesInForm.unsubscribe();
}
 
 <form #form="ngForm">
   
</form>
 
  • Если указанная форма является reactive form
 form: FormGroup;

constructor(private formBuilder: FormBuilder) {}

ngOnInit() {
  this.form = this.formBuilder.group({
  
  });

  this.onChanges();
}

onChanges(): void {
  this.form.valueChanges.subscribe(value => {
    // Invoke call to injectable
  });
}