Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular ngOnChanges正在多次呼叫_Angular_Ionic Framework_Angular7_Ionic4 - Fatal编程技术网

Angular ngOnChanges正在多次呼叫

Angular ngOnChanges正在多次呼叫,angular,ionic-framework,angular7,ionic4,Angular,Ionic Framework,Angular7,Ionic4,我使用ngFor生成了多个离子载玻片,并在其中插入了一个组件。它多次调用ngOnChanges。我希望它只调用一次,这样我就可以调用我的api了 我试过使用多个角度的钩子 这就是我创建幻灯片的方式,菜单有19个元素 <ion-slides #slides [options]="slideOpts" (ionSlideDidChange)="slideChanged($event)"> <ion-slide *ngFor="let i of menu; let j = index

我使用ngFor生成了多个离子载玻片,并在其中插入了一个组件。它多次调用ngOnChanges。我希望它只调用一次,这样我就可以调用我的api了

我试过使用多个角度的钩子

这就是我创建幻灯片的方式,菜单有19个元素

<ion-slides #slides [options]="slideOpts" (ionSlideDidChange)="slideChanged($event)">
<ion-slide *ngFor="let i of menu; let j = index">
  <h1>{{ i.name }}</h1>
  <app-homenews [categoryId]="currentCategoryId" ></app-homenews>
</ion-slide>
</ion-slides>
我只想叫它一次,它现在叫了19次


我可以在这里使用rxjs吗?

ngOnChanges
在模板绑定中输入变量的值发生更改时运行。因此多次触发它是一种正常行为。如果希望只执行一次代码,则可以像这样使用它

@Input() isFirstRun;
ngOnChanges(changes: SimpleChanges) {
  if(this.isFirstRun){
     let chg = changes['categoryId'];
     console.log(chg.currentValue);
  }
}

<ion-slide *ngFor="let i of menu; let j = index">
  <h1>{{ i.name }}</h1>
  <app-homenews [isFirstRun]="j===0?true:false" [categoryId]="currentCategoryId" ></app-homenews>
</ion-slide>
@Input()是第一次运行;
ngOnChanges(更改:SimpleChanges){
if(this.isFirstRun){
设chg=changes['categoryId'];
控制台日志(chg.currentValue);
}
}
{{i.name}

您可以在服务中添加isFirstRun标志,并在组件中使用该标志 您可以继续使用ngOnchanges,因为它在值更改时会很有帮助

ngOnChanges(changes: SimpleChanges) {
if (this.flagService.isFirstRun || value has changed) {
// call API
}
} 

我用过一次这种方法来避免使用ngOnChanges循环

在您的组件中:

private _changes;
private id;
@Input()
  set changes(changes) {     

      this._changes= changes;
      this.id = changes[id];

    }
  }
  get changes(): string {
    return this._changes;
  }

我怀疑上面的任何一个都会起作用,因为组件模板在for循环内部,所以它每次都会调用ngOnInit(与调用ngOnChanges相同-即使CurrentCategoryId在循环内部没有修改),变量方法也会因同样的原因不起作用,该变量每次都将获得默认值,因此您可以将
isFirstRun
作为输入变量,并从父级提供它。在模板第一次迭代中,您可以将值作为true发送。
private _changes;
private id;
@Input()
  set changes(changes) {     

      this._changes= changes;
      this.id = changes[id];

    }
  }
  get changes(): string {
    return this._changes;
  }