【问题标题】:Getting value of checkbox using angular使用角度获取复选框的值
【发布时间】:2020-03-03 22:42:53
【问题描述】:

我在获取角度值 checkbox 时遇到问题。这是sn-p:

<div class="list-group-item" *ngFor="let ticket of tickets">
   <input
      type="checkbox"
      [name]="ticket.id"
      [id]="ticket.id"
      [value]="ticket.id"
      formControlName="ticketTypes"
   />
   <label for="{{ ticket.id }}">{{ ticket.name }}</label>
</div>

我超过了复选框的值true。如何正确获取复选框值?

这是stackblitz

【问题讨论】:

标签: javascript angular typescript angular7


【解决方案1】:

您可以使用(change),每次在输入元素上检测到更改时都会触发它,然后编写自定义逻辑以从列表中获取选中的项目,例如:

HTML:

<div class="list-group-item" *ngFor="let ticket of tickets">
    <input type="checkbox" [name]="ticket.id" [id]="ticket.id" [value]="ticket.id" (change)="onCheck(ticket.id)"/>
    <label for="{{ ticket.id }}">{{ ticket.name }}</label>
</div>

<pre>{{tickets | json}}</pre>

TS 代码:

import { Component } from "@angular/core";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  tickets = [{ id: 1, name: "Test1" }, { id: 2, name: "Test2" }];

  checkedTickets = [];

  onCheck(evt) {
    if (!this.checkedTickets.includes(evt)) {
      this.checkedTickets.push(evt);
    } else {
      var index = this.checkedTickets.indexOf(evt);
      if (index > -1) {
        this.checkedTickets.splice(index, 1);
      }
    }
    console.log(this.checkedTickets);
  }
}

Working Demo

【讨论】:

  • 但是我不认为这会解决 OP 的问题,IMO 你不能只在复选框中使用 formControl,你能提供同样的工作演示吗
  • 没有formcontrolname,只需使用(change)="onCheck(ticket.id)",将选中的项目保存在一个数组中对我有用
  • 如果流程像check -> uncheck -> check 这样会在数组中添加重复的条目,您需要一个自定义逻辑来再次处理这个问题。所以总的来说我不推荐使用这种场景。
  • 最后,如果用户不想在现有对象中添加额外属性,则此解决方案很好,但如果 [(ngModel)] 工作正常,那么它更好
  • @AdritaSharma 测试:Click Test1 then Test2 then uncheck Test1 it shows empty array 但预期为Test2
【解决方案2】:

在这种情况下,如果您正在处理表单,最好/建议使用formArray,或者您可以简单地使用ngModel Angular 的两种数据绑定方式。

 <form [formGroup]="form" (submit)="submit(form.value)">
  <div *ngFor="let s of addOns.controls; let j=index">
   <input type="checkbox" [formControl]="s"/> {{user1.addOns[j].name}}
  </div>
 </form>

也只是formControlName,即在处理Radio Buttons 时通常使用单个控件,因为在这种情况下,用户可以始终选择单个值,但在checkboxes 的情况下,您也可以选择多个条目,其设计如下这个,所以你可以在这种情况下使用array,就像我上面的例子一样。

Working Example

或者如果你想使用ngModel,你可以像这样使用它-

<ul>
    <li *ngFor="let item of list">
    <input type="checkbox" [(ngModel)]="item.checked">{{item.title}}
  </li>
</ul>

Working Example

【讨论】:

  • 我会选择[(ngModel)]="item.checked",它既干净又简单!
  • 酷,总是你的选择:) @PrashantPimpale 但是当你处理这么长的表单时,你通常会避免使用 ngModel 一个额外的变量,所以在这些情况下 formArray 将是有益的。你的想法?
  • 可以,甚至不需要添加额外的字段来维护状态(Checked/Unchecked)
  • 是的@PrashantPimpale :) 如果你喜欢我处理这个问题的方式,请竖起大拇指:P
  • 请检查stackblitz
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2020-12-27
相关资源
最近更新 更多