【问题标题】:Passing checkbox value to array in Angular将复选框值传递给Angular中的数组
【发布时间】:2020-06-25 20:42:23
【问题描述】:

我正在研究一种解决方案,其中根据乘客编号生成的每个输入都会获得额外的复选框。我想传递每个复选框的值并将其绑定到它旁边的输入。计划最终得到一个数组,其中我有输入字段的值 + 每个复选框的值。我不确定如何继续前进。目前,我有:

组件.HTML:

<li *ngFor="let passenger of createRange(showStorage.passengersNumber); let i=index"><input type="text" [(ngModel)]="passengersData[i]" placeholder="Name and surname">
<input type="checkbox" (click)="addChild($event)">Child
<input type="checkbox" (click)="addLuggage($event)">Luggage
</li>

组件.TS

  constructor() {
    this.passengersData = [];
  }

  public passengersData: any[];
  public luggageCounter: number = 0;
  public childrenCounter: number = 0;

  createRange(number){
  var items: number[] = [];
  for(var i = 1; i <= number; i++){
     items.push(i);
  }
  
  return items;
}

  addLuggage(event) {
    console.log("Added luggage");
    this.luggageCounter++
  }

  addChild(event) {
    this.childrenCounter++
    console.log(event);
  }

感谢您的帮助!

堆栈闪电战:https://stackblitz.com/edit/flight-date-picker-with-service-done-qfmn6p

【问题讨论】:

    标签: javascript angular input event-binding


    【解决方案1】:

    对孩子和行李使用具有 name 属性和布尔属性的数组,并仅在更新乘客数量时重新生成数组,保留以前的乘客。

    这是一个有效的 StackBlitz https://stackblitz.com/edit/angular-ivy-s7dtu4?file=src%2Fapp%2Fapp.component.ts

    Number of passengers <input type="text" [ngModel]="passengers.length" (ngModelChange)="updateNumOfPassengers($event)">
    <li *ngFor="let passenger of passengers; let i=index">
      <input type="text" [name]="'name_' + 1" [(ngModel)]="passenger.name" placeholder="Name and surname">
      <input type="checkbox" [checked]="passenger.child" (change)="passenger.child = !passenger.child">Child
      <input type="checkbox" [checked]="passenger.luggage" (change)="passenger.luggage = ! passenger.luggage">Luggage
    </li>
    
      passengers = [];
    
      updateNumOfPassengers(input: string) {
        const numOfPassengers = parseInt(input);
        if (!isNaN(numOfPassengers) && numOfPassengers >= 0) {
          const passengersToAdd = numOfPassengers - this.passengers.length;
          if (passengersToAdd > 0) {
            this.passengers = [...this.passengers, ...Array.from({ length: passengersToAdd }, _ => ({ name: '', child: false, luggage: false }))];
          } else if (passengersToAdd < 0) {
            this.passengers = this.passengers.filter((_, index) => index < numOfPassengers);
          }
        }
      }
    

    【讨论】:

    • 感谢您提供此解决方案,但也许我做错了什么 - 显然代码使网站崩溃。我在 stackblitz 和 Visual Studio 代码中尝试了这个,这两种情况下网站都会在无限加载时停止。我在 let i=index 之后添加了一个缺少的引号。你能再检查一下这里有什么问题吗?
    • 我还没有测试代码,我可能会尝试明天运行 StackBlitz,今天星期五晚上太晚了。
    • 这永远不会起作用,每次更改检测运行时 createRange 函数都会创建一个新数组。
    • 使用passengers = Array.from({ length: numOfpassengers }, _ =&gt; ({ name: '', child: false, luggage: false }));
    • passengers = Array.from({ length: parseInt(localStorage['numOfPassengers']) }, _ =&gt; ({ name: '', child: false, luggage: false })); 就是你所需要的,完全不需要函数,只需要声明乘客数组。
    猜你喜欢
    • 2015-06-07
    • 2016-01-30
    • 2020-12-20
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2020-09-28
    相关资源
    最近更新 更多