【问题标题】:Angular 6 + Bootstrap 4 Select all and Deselect all CheckboxesAngular 6 + Bootstrap 4 全选和取消全选复选框
【发布时间】:2019-01-17 12:03:03
【问题描述】:

我在尝试让 Bootstrap 4 Checkboxes 使用全选和取消全选 Angular 6+ 选项时遇到问题。当我在这里使用原始代码时,我可以让它工作: http://www.angulartutorial.net/2017/04/select-all-deselect-all-checkbox.html
但问题是 Bootstrap 使用不同的事件来点击他们的复选框。有人对此有解决方案吗?

<div class="form-check">
    <input class="form-check-input" type="checkbox" (change)="selectAll()">
    <label class="form-check-label">
        Select All
      </label>
</div>
<div class="form-check" *ngFor="let n of names">
    <input class="form-check-input" type="checkbox" value="{{n.name}}" [(ngModel)]="selectedNames" (change)="checkIfAllSelected()">
    <label class="form-check-label">
        {{n.name}}
      </label>
</div>

还有 TS:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-checkbox',
  templateUrl: './checkbox.component.html',
  styleUrls: ['./checkbox.component.scss']
})
export class CheckboxComponent implements OnInit {
  title = 'Checkbox';
  names: any;
  selectedAll: any;
  constructor() {
    this.title = "Select all/Deselect all checkbox - Angular 2";
    this.names = [
      { name: 'Prashobh', selected: false },
      { name: 'Abraham', selected: false },
      { name: 'Anil', selected: false },
      { name: 'Sam', selected: false },
      { name: 'Natasha', selected: false },
      { name: 'Marry', selected: false },
      { name: 'Zian', selected: false },
      { name: 'karan', selected: false },
    ]

  }
  selectAll() {
    for (var i = 0; i < this.names.length; i++) {
      this.names[i].selected = this.selectedAll;
    }
  }
  checkIfAllSelected() {
    this.selectedAll = this.names.every(function(item:any) {
        return item.selected == true;
      })
  }

  ngOnInit() {
  }
}

【问题讨论】:

    标签: javascript html bootstrap-4 angular6


    【解决方案1】:

    应该这样做

    这是一个plnkr:https://next.plnkr.co/edit/ypGmwE32Xn1bgbqd?preview

    HTML:

    <div class="form-check">
        <input class="form-check-input" type="checkbox" (change)="selectAll()" [checked]="selectedAll">
        <label class="form-check-label">
            Select All
          </label>
    </div>
    <div class="form-check" *ngFor="let n of names">
        <input class="form-check-input" type="checkbox" value="{{n.name}}" [(ngModel)]="n.selected" (change)="checkIfAllSelected()">
        <label class="form-check-label">
            {{n.name}}
          </label>
    </div>
    

    TS:

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'app-checkbox',
      templateUrl: './checkbox.component.html',
      styleUrls: ['./checkbox.component.scss']
    })
    export class CheckboxComponent implements OnInit {
    
    
        title = 'Checkbox';
      names: any;
      selectedAll: any;
      selectedNames: any;
        constructor() {
              this.title = "Select all/Deselect all checkbox - Angular 2";
        this.names = [
          { name: 'Prashobh', selected: false },
          { name: 'Abraham', selected: false },
          { name: 'Anil', selected: false },
          { name: 'Sam', selected: false },
          { name: 'Natasha', selected: false },
          { name: 'Marry', selected: false },
          { name: 'Zian', selected: false },
          { name: 'karan', selected: false },
        ]
        }
        selectAll() {
            this.selectedAll = !this.selectedAll;
    
            for (var i = 0; i < this.names.length; i++) {
                this.names[i].selected = this.selectedAll;
            } 
      }
      checkIfAllSelected() {
          var totalSelected =  0;
          for (var i = 0; i < this.names.length; i++) {
                if(this.names[i].selected) totalSelected++;
            } 
        this.selectedAll = totalSelected === this.names.length;
    
      return true;
      }
    
      ngOnInit() {
      }
    }
    

    【讨论】:

      【解决方案2】:

      我不确定引导程序是否有任何特殊逻辑用于复选框中的事件绑定。我想您的代码中缺少这一点。绑定见以下sn-p:

      <form [formGroup]="form">
          <div class="form-check" formArrayName="unitArr">
                              <input class="form-check-input" type="checkbox" [checked]="checkAllSelected()" 
               (click)="selectAll($event.target.checked)" id="select-all">
                              <label class="form-check-label" for="select-all">
                                  Select All
                              </label>
                          </div>
                          <div class="form-check" *ngFor="let n of names; let i = index;" >
                              <input class="form-check-input" type="checkbox" value="{{n.name}}" [(ngModel)]="selectedNames" (change)="checkIfAllSelected()" [attr.id]="'check' + i">
                              <label class="form-check-label" [attr.for]="'check' + i">
                                  {{n.name}}
                              </label>
                          </div>
      </form>
      
      checkAllSelected() {
        return this.form.controls.unitArr.controls.every(x => x.value == true)
      }
      
      selectAll(isChecked) {
        if isChecked 
           this.form.controls.unitArr.controls.map(x => x.patchValue(true))
        else
           this.form.controls.unitArr.controls.map(x => x.patchValue(false))
      }
      

      输入的“id”必须用“for”映射到“label”。不确定您是否有任何特殊要求,但这是非常基本的 HTML 概念。请试一试,看看您的问题是否得到解决。

      编辑:请注意,我不熟悉 Angular6 的概念,但是上面的代码确实适用于 Angular 2。您可以检查以上任何一点是否对您有帮助。万事如意!

      【讨论】:

      • 所以现在这允许第二个框选择全部而不是第一个,并且您不能选择其他框。有什么想法吗?
      • 这并没有回答他的问题。尽管您对需要参考信息是正确的,但如果他希望文本也选中该框,则没有任何问题要求这样做。
      • @racamp101 请再读一遍我上面提到的“我不确定引导程序在复选框中有任何特殊的事件绑定逻辑”!!!。并阅读罗伯特的上述评论,逻辑确实帮助他解决了这个基本处理在他的代码中缺失。谦虚的建议,请在否决之前考虑提问者的担忧!
      猜你喜欢
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2011-09-09
      相关资源
      最近更新 更多