Angular 单击事件:如何 select a 元素中的复选框?

Angular click event: how to select a checkbox within an a element?

在我的 Angular 应用程序中,我有以下菜单:

如您所见,我有项目(即 a 元素)以及每个项目中的复选框和标签:

<span class="caption">RAM</span>
<a class="item">
    <div class="item-checkbox">
        <input type="checkbox" tabindex="0" class="hidden">
        <label>4 GB</label>
    </div>
</a>
<a class="item">
    <div class="item-checkbox">
        <input type="checkbox" tabindex="0" class="hidden">
        <label>8 GB</label>
    </div>
</a>
<a class="item">
    <div class="item-checkbox">
        <input type="checkbox" tabindex="0" class="hidden">
        <label>16 GB</label>
    </div>
</a>

我应该如何将 (click) 添加到每个项目以正确处理事件捕获,以便如果用户单击标签或整个项目我会选中相关的复选框?

...或者您知道更好的方法来达到我的意思吗?

首先你应该使用 *ngFor 来列出你所有的选项:

html:

<a class="item" *ngFor="let choice of checks; let i=index">
    <div class="item-checkbox">
        <input type="checkbox" tabindex="0" class="hidden" [value]="choice.value" (change)="onCheckChange($event)">
        <label>{{choice.title}}</label>
    </div>
</a>

分量:

public checks: Array<choices> = [
  {title: '4 GB', value: '4'},
  {title: "8 GB", value: '8'},
  {title: "16 GB", value: '16'}
];

public onCheckChange(event) {
    // do some things here
}

此外,您应该使用 Reactive Forms 来验证您的选择: https://angular.io/guide/reactive-forms

您必须创建一个布尔数组并将其绑定到您的复选框。

.ts file

  myArray: any[] = [
 {
      "size": "2GB",
      "value":false
    },
    {
      "size": "4GB",
      "value":false
    },
    {
      "size": "8GB",
      "value":false
    }
]

.html file

<div *ngFor="let data of myArray">
 <a class="item">
    <div class="item-checkbox">
        <input type="checkbox" tabindex="0" class="hidden" [(ngModel)]="data.value" (ngModelChange)="changeHandler()">
        <label>{{data.size}}</label>
    </div>
 </a>
</div>

工作演示:link

你可以这样做:

const ramOptions = [
  {
    id: 1,
    size: '4 GB'
  },
  {
    id: 2,
    size: '8 GB'
  },
  {
    id: 3,
    size: '16 GB'
  }
]

并且在 html 中:

<a class="item" *ngFor="let option of ramOptions">
    <div class="item-checkbox">
        <input type="checkbox" tabindex="0" class="hidden" (change)="onSelect(option.id)">
        <label>{{option.size}}</label>
    </div>
</a>

如果在.js/.ts 文件中,您可以创建一个接口来定义处理程序。正如:

onSelect(id: string) {
  ...
}

如果您可以将所有复选框放在一个容器中,您可以在容器上设置一个 click 事件侦听器,event.target 将为您提供被点击的元素和 previousElementSibling将 select 兄弟输入。

function doSomething() {
    const selectedInput = event.target.previousElementSibling;
    selectedInput.checked = selectedInput.checked? false : true;
}

但如果您将来可能记录结构变化,例如,如果其他元素进入输入和标签之间,或者它们的顺序发生变化,那么兄弟 select或将失败。要解决此问题,您可以使用父级 select 或 select 其内部的复选框输入元素。

document.getElementById('container').addEventListener('click', doSomething);

function doSomething() {
    const selectedElement = event.target.parentElement.querySelector('input[type="checkbox"]');
    selectedElement.checked = selectedElement.checked? false:true;
}
<div id= 'container'>
  <span class="caption">RAM</span>
  <a class="item">
      <div class="item-checkbox">
          <input type="checkbox" tabindex="0" class="hidden" value="4 GB">
          <label>4 GB</label>
      </div>
  </a>
  <a class="item">
      <div class="item-checkbox">
          <input type="checkbox" tabindex="0" class="hidden" value="8 GB">
          <label>8 GB</label>
      </div>
  </a>
  <a class="item">
      <div class="item-checkbox">
          <input type="checkbox" tabindex="0" class="hidden" value="16 GB">
          <label>16 GB</label>
      </div>
  </a>
</div>

要确保单击标签会切换复选框,请在标签内包含输入元素(如 MDN 中所述):

<a class="sub-item item">
  <div class="item-checkbox">
    <label><input type="checkbox" tabindex="0" class="hidden">4 GB</label>
  </div>
</a>

如果您还希望标签填充锚元素,请按如下所示定义CSS。使用此样式后,单击锚点将切换复选框。

.ui.secondary.menu a.item {
  padding: 0px;
}

div.item-checkbox {
  width: 100%;
  height: 100%;
}

div.item-checkbox > label {
  display: block;
  padding: .78571429em .92857143em;
}

div.item-checkbox > label > input {
  margin-right: 0.25rem;
}

有关演示,请参阅 this stackblitz