ค้นหาเว็บไซต์

javascript - angular 2 กล่องเลือกเพื่อเลือกทั้งหมด


ปัญหา

ฉันได้หาคำตอบสำหรับปัญหานี้แล้วแต่ยังติดอยู่ ฉันมีตารางที่มีหลายแถว โดยมีช่องทำเครื่องหมายในแต่ละแถว ฉันต้องการช่องทำเครื่องหมายเพื่อเลือกทั้งหมดและยกเลิกการเลือกทั้งหมด นี่คือตัวอย่างโค้ดบางส่วน

แม่แบบ

<table class="table table-bordered table-condensed table-striped table-hover">
<thead>
    <tr>
        <th></th>
        <th>Size</th>
        <th>Diameter</th>
        <th class="text-center">
            <input type="checkbox" name="all" (change)="checkAll($event)"/>
        </th>
    </tr>
</thead>
<tbody>
    <tr *ngFor="let size of sizes | async ; let i = index">
        <td class="text-right">{{i + 1}}</td>
        <td class="text-right">{{size.size}}</td>
        <td>{{size.diameter}}</td>
        <td class="text-center">
            <input type="checkbox" name="sizecb[]" value="{{size.id}}"/>
        </td>
    </tr>
</tbody>

ส่วนประกอบ

    export class ListSizeComponent implements OnInit {
    constructor () {
    }

    sizes: any;

    setSizes() {
        this.sizes = [
            {'size': '0', 'diameter': '16000 km'},
            {'size': '1', 'diameter': '32000 km'}
        ]
    }

    checkAll(ev) {
        if (ev.target.checked) {
            console.log("True")
        } else {
            console.log("False");
        }
    }

    ngOnInit(): void {
        this.setSizes();
    }
}

คำตอบ #1

คุณสามารถใช้ ngModel เพื่อทำสิ่งนั้นได้

แม่แบบ:

<input type="checkbox" name="all" [checked]="isAllChecked()" (change)="checkAll($event)"/>
....
<input type="checkbox" name="sizecb[]" value="{{size.id}}" [(ngModel)]="size.state"/>

ส่วนประกอบ:

checkAll(ev) {
  this.sizes.forEach(x => x.state = ev.target.checked)
}

isAllChecked() {
  return this.sizes.every(_ => _.state);
}

ตัวอย่าง Stackblitz

คำตอบ #2

นี่สามารถทำได้ โดยไม่ต้อง ใช้ [(ngModel)] ด้วย !

เพียงประกาศและกำหนดค่าเริ่มต้นตัวแปรบูลีน 'isSelected' ให้เป็น false ในคอมโพเนนต์ 'ListSizeComponent' และเพิ่มคุณสมบัติ [Checked]="isSelected" ให้กับทุกกล่องทำเครื่องหมาย (checkbox) และเพิ่มเหตุการณ์เปลี่ยนแปลง (change) ต่อกล่องทำเครื่องหมาย 'all' ดังนี้ (change)="isSelected=true"

ดังนั้นโค้ดของคุณจึงดูเหมือนด้านล่างนี้,

<table class="table table-bordered table-condensed table-striped table-hover">
<thead>
    <tr>
        <th></th>
        <th>Size</th>
        <th>Diameter</th>
        <th class="text-center">
            <input type="checkbox" name="all" (change)="isSelected = true"/>
        </th>
    </tr>
</thead>
<tbody>
    <tr *ngFor="let size of sizes | async ; let i = index">
        <td class="text-right">{{i + 1}}</td>
        <td class="text-right">{{size.size}}</td>
        <td>{{size.diameter}}</td>
        <td class="text-center">
            <input type="checkbox" name="sizecb[]" value="{{size.id}}" 
             [checked]="isSelected"/>
        </td>
    </tr>
</tbody>
</table>

ส่วนประกอบ :

export class ListSizeComponent implements OnInit {
constructor () {
}

sizes: any;
isSelected = false;

setSizes() {
    this.sizes = [
        {'size': '0', 'diameter': '16000 km'},
        {'size': '1', 'diameter': '32000 km'}
    ]
}



ngOnInit(): void {
    this.setSizes();
}

บทความที่เกี่ยวข้อง