【问题标题】:infinite loop with array.push() in AngularAngular中带有array.push()的无限循环
【发布时间】:2020-09-18 16:39:40
【问题描述】:

我有一个小问题,我不明白为什么......

情况:我有一个当天所有预订的数组。我想,如果我点击一个按钮“晚上”,只有晚上的预订。

当我点击一个按钮时,getEvening() 函数在父组件中被调用。

在我的子 component.html 中,我有:

<tbody *ngFor="let resa of resas">
        <tr class="addred" (click)='setResa(resa)'>
            <td *ngIf="!size">{{ resa.confirmResa }}</td>
            <td>{{ resa.arrivee.split(' ')[1] }}</td>
            <td>{{ resa.nom_client }}</td>
            <td *ngIf="!size">{{ resa.nbre_client }}</td>
            <td *ngIf="!size">{{ resa.num_phone_client }}</td>
            <td *ngIf="!size">{{ resa.num_table }}</td>
            <td *ngIf="!size">{{ resa.formule }}</td>
            <td *ngIf="!size" (click)="stopEvent($event)" (mouseover)=setResaId(resa)>

                <input class="venu" type="checkbox" clrToggle (change)="came($event)" [checked]="resa.venu === 1" />
            </td>
        </tr>
    </tbody>

在我的子 component.ts 中,我有:

export class ReservationTabComponent implements OnInit {


  @Input() date: Subject<string>;

  @Output() resa = new EventEmitter<any>();

  addred: boolean;
  resas: any[] = [];
  resaId: string;

  dateDay: string;
  hour: number;

  scrHeight: number;
  scrWidth: number;

  size: boolean;
  bool: boolean;

  venu: number;

  constructor(
    private datastore: DatastoreService,
    private resaService: ReservationService
  ) { }

  ngOnInit(): void {
    this.getScreenSize();
    this.date.subscribe((date) => {
      this.dateDay = date;
      this.setDate(this.dateDay);
    });
    this.addred = false;
  }

  setDate(date: string) {
    this.datastore.findResaOfTheDay(date)
      .subscribe(
        (resas) => {
          this.resas = resas.data.original;
          console.log(this.resas);
        });
  }



  getAll() {

    this.setDate(this.dateDay);
  }

  getMidi() {
    this.resas = [];
  }

  getEvening() {
    for (let resa of this.resas) {

      this.hour = parseInt(moment().format(resa.arrivee.split(' ')[1]), 10);
      if (this.hour > 13) {
        this.resas.push(resa);  <-- this causing infinite loop...
        console.log(resa);  <-- this works correctly
      }
    }
  }
}

实际上,当我单击按钮时,我有一个带有 push() 方法但没有 console.log() 方法的无限循环......

我不明白为什么......

【问题讨论】:

    标签: arrays angular typescript push infinite-loop


    【解决方案1】:

    你将更多元素推送到你正在迭代的同一个列表中,因此每次你推送一个元素时,你都会迭代它,然后再次推送它并永远重复。

    假设你匹配 B:

     v 
    [A,B,C]
    
       v 
    [A,B,C] push B
    
         v 
    [A,B,C,B]
    
           v 
    [A,B,C,B] push B
    
             v 
    [A,B,C,B,B] push B
    
               v 
    [A,B,C,B,B,B] push B
    

    您可能想要使用两个不同的数组 :)

    【讨论】:

    • 啊,是的! !当然 !我每次都迭代同一个数组,所以他永远不会停止!谢谢你,对不起......我知道这是一个简单的错误......非常感谢! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2021-04-29
    • 2016-03-29
    相关资源
    最近更新 更多