nz-table复选功能改造(整行可选)

如果你用到了nz-table组件,而且有勾选列表的需求时,就可以用该组件自带的nzShowCheckbox勾选属性,用法如下

<nz-table
      #rowSelectionTable
      nzShowPagination
      nzShowSizeChanger
      [nzData]=""
      (nzCurrentPageDataChange)=""
    >
      <thead>
        <tr>
          <th
            nzShowCheckbox
            [(nzChecked)]=""
            [nzIndeterminate]=""
            (nzCheckedChange)=""
          ></th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let data of rowSelectionTable.data">
          <td
            nzShowCheckbox
            [(nzChecked)]=""
            (nzCheckedChange)=""
          ></td>
        </tr>
      </tbody>
</nz-table>

第一列是联动的选择框,增加 nzShowCheckbox 后,th 获得和 nz-checkbox 一样的功能,选择后进行操作,完成后清空选择,请注意:数据逻辑需要自行控制。

数据方面组件案例定义了一个mapOfCheckedId对象,可以把数据里用于唯一标识的id或其他字段的值存入该对象,然后通过改变它的值(boolean)去控制列表行要不要勾选。

//ts文件定义:

mapOfCheckedId: { [key: string]: boolean } = {};

//html文件:

<nz-table
      #rowSelectionTable
      nzShowPagination
      nzShowSizeChanger
      [nzData]=""
      (nzCurrentPageDataChange)=""
    >
      <thead>
        <tr>
          <th
            nzShowCheckbox
            [(nzChecked)]=""
            [nzIndeterminate]=""
            (nzCheckedChange)=""
          ></th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let data of rowSelectionTable.data">
          <td
            nzShowCheckbox
            [(nzChecked)]="mapOfCheckedId[data.id]"
            (nzCheckedChange)=""
          ></td>
        </tr>
      </tbody>
</nz-table>

列表勾选除了要控制数据逻辑,还需自行设置样式。组件提供了[nzIndeterminate]属性控制勾选样式(主要用于设置th的复选框css),th的复选框可以有三种状态:空、‘√’、‘-’,这里需要和它的[nzChecked]属性配合使用:

[nzIndeterminate] [nzChecked] css显示
true true -
false true
false false 无css

ts:

export class InterviewListComponent implements OnInit{  mapOfCheckedId: { [key: string]: boolean } = {};
    allListCheck = {
        allChecked: false,
        indeterminate: false
    };
    constructor() { }
    ngOnInit(){ }  

   //表格选中的样式处理

 refreshStatus(): void {

  this.dataTable.forEach((item, i) => {

    if (this.mapOfCheckedId[item.candidateId]) {

      if (!this.checkedData.some(items => items.candidateId === item.candidateId)) { this.checkedData.push(item); }

    } else {

     this.checkedData = this.checkedData.filter(items => items.candidateId !== item.candidateId);

    }

   });

   //设置全选checkbox的样式

   if (this.dataTable.every(item => this.mapOfCheckedId[item.candidateId] )){

    this.allListCheck.allChecked = true;

    this.allListCheck.indeterminate = false;

   }else{

    this.allListCheck.allChecked = false;

    this.allListCheck.indeterminate = this.dataTable.some(item => this.mapOfCheckedId[item.candidateId]);

   }

   this.copyCheckData = JSON.parse(JSON.stringify(this.checkedData));

  }

  checkAll(value: boolean): void {

      this.dataTable.forEach(item => this.mapOfCheckedId[item.candidateId] = value);
        this.refreshStatus();

}

  clearChecked(){

   this.checkedData = [];

    this.copyCheckData = [];

   this.mapOfCheckedId = {};

   this.allListCheck.allChecked = false;

    this.allListCheck.indeterminate = false;

  }

}

html:

<nz-table [nzLoading]="loading" #activeTable [nzData]="dataTable" [nzShowPagination]=false [nzFrontPagination]="false">
    <thead>
       <tr>
          <th  width="34" nzShowCheckbox [nzChecked]="allListCheck.allChecked" [nzIndeterminate]="allListCheck.indeterminate" (nzCheckedChange)="checkAll($event)"></th>
        </tr>
    </thead>
    <tbody>
        <tr *ngFor="let data of activeTable.data;let i=index" [ngClass]="{‘checked‘:mapOfCheckedId[data.candidateId]}">
          <td
              nzShowCheckbox
              [(nzChecked)]="mapOfCheckedId[data.candidateId]"(nzCheckedChange)="refreshStatus()"
            ></td>
        </tr>
    </tbody>
</nz-table>

这样就可以实现表格复选功能了,但是只能在点击复选框时才能进行勾选,想要整行都可以,就需要再改造下:

ts:

export class InterviewListComponent implements OnInit{  mapOfCheckedId: { [key: string]: boolean } = {};
    allListCheck = {
        allChecked: false,
        indeterminate: false
    };
    constructor() { }
    ngOnInit(){}   selectedTr(data){      this.mapOfCheckedId[data.candidateId] = !this.mapOfCheckedId[data.candidateId];      this.refreshStatus();    }

   //表格选中的样式处理

 refreshStatus(): void {

  this.dataTable.forEach((item, i) => {

    if (this.mapOfCheckedId[item.candidateId]) {

      if (!this.checkedData.some(items => items.candidateId === item.candidateId)) { this.checkedData.push(item); }

    } else {

     this.checkedData = this.checkedData.filter(items => items.candidateId !== item.candidateId);

    }

   });

   //设置全选checkbox的样式

   if (this.dataTable.every(item => this.mapOfCheckedId[item.candidateId] )){

    this.allListCheck.allChecked = true;

    this.allListCheck.indeterminate = false;

   }else{

    this.allListCheck.allChecked = false;

    this.allListCheck.indeterminate = this.dataTable.some(item => this.mapOfCheckedId[item.candidateId]);

   }

   this.copyCheckData = JSON.parse(JSON.stringify(this.checkedData));

  }

  checkAll(value: boolean): void {

  let newValue = !value;
        this.dataTable.forEach(item => this.mapOfCheckedId[item.candidateId] = newValue);
        this.refreshStatus();

}

  clearChecked(){

   this.checkedData = [];

    this.copyCheckData = [];

   this.mapOfCheckedId = {};

   this.allListCheck.allChecked = false;

    this.allListCheck.indeterminate = false;

  }

}

html:

<nz-table [nzLoading]="loading" #activeTable [nzData]="dataTable" [nzShowPagination]=false [nzFrontPagination]="false">
    <thead>
       <tr (click)="checkAll(allListCheck.allChecked)">            <th  width="34" nzShowCheckbox [nzChecked]="allListCheck.allChecked" [nzIndeterminate]="allListCheck.indeterminate" (click)="checkAll(allListCheck.allChecked);$event.stopPropagation()"></th>
        </tr>
    </thead>
    <tbody>
        <tr *ngFor="let data of activeTable.data;let i=index" [ngClass]="{‘checked‘:mapOfCheckedId[data.candidateId]}" (click)="selectedTr(data)">
          <td
              nzShowCheckbox
              [(nzChecked)]="mapOfCheckedId[data.candidateId]"
                (click)="refreshStatus();$event.stopPropagation()"
            ></td>
        </tr>
    </tbody>
</nz-table>

说明一下:在tr上设置了点击事件后,td复选框原本的(nzCheckedChange)就不能再用了,需要改成click事件。

原文地址:https://www.cnblogs.com/myyouzi/p/12200136.html

时间: 2024-08-02 10:31:47

nz-table复选功能改造(整行可选)的相关文章

QComboBox实现复选功能

需求: 下拉列表有复选功能 不可编辑 显示所有选中项 关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget + QListWidgetItem Model/View + QItemDelegate 当然,还有其它更好的方式,这里就不再过多介绍了,下面介绍一种比较简单的: QListWidget + QListWidgetItem + QCheckBox pListWidget = new QListWidget

QComboBox实现复选功能(三种方法:嵌套QListWidget, 设置QStandardItemModel, 设置Delegate)

今天介绍一下一个小东西 — 如何让QComboBox实现复选功能? 需求: 下拉列表有复选功能 不可编辑 显示所有选中项 关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget + QListWidgetItem Model/View + QItemDelegate 当然,还有其它更好的方式,这里就不再过多介绍了,下面介绍一种比较简单的: QListWidget + QListWidgetItem + QChec

选中table一格,实现整行高亮

1.纯css实现,适用于需要HTML尽量简单的情况 <style> tr:hover td{ background: #ede; } </style> <body><table> <tr><th>1</th><th>2</th><th>3</th></tr> <tr class=""><td ><A HREF=&q

Vue.js小Demo--单选和复选功能实现

Vue官方文档上有单选按钮radio和复选按钮checkbox的例子. 受此启发,写了这个小demo. 演示图: demo.vue文件代码: <div> <div class="Select"> <p class="Title">Single choice</p> <span class="Box" :class="{Selected_active:index == One}&quo

通过行控制table复选框状态

<el-table @row-click="clickRow" ref="moviesTable" :data="insertModel.tableData"@selection-change="handleSelectionChange"><el-table-column type="selection" width="55"/><el-table-col

jQuery学习笔记(6)--复选框控制表格行高亮

1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <head runat="server"> 3 <title></title> 4 <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 5 <style ty

为DataGridView控件实现复选功能

实现效果: 知识运用: DataGridViewCheckBoxColumn类 实现代码: private class Fruit { public int Price { get; set; } public string Name { get; set; } public bool ft; } private List<Fruit> P_fruit; private void Form1_Load(object sender, EventArgs e) { DataGridViewChec

自定义实现复选框

项目中需要用到复选框,而QComboBox只能实现单选操作.即使是加以改造可以多选,也只能一次选择一个选项,不符合项目需求.于是就花了两天时间来自己实现一个可行的复选框. 实现方案:QLineEdit + QListView + QPushButton 第一步是实现类似于QComboBox的显示框. 一个只读的QLineEdit + QPushButton就可以实现.这个QPushButton对象的父指针必须是QLineEdit,这样按钮才能浮在QLineEdit上. 需要根据实现界面大小计算按

自定义实现 PyQt5 下拉复选框 ComboCheckBox

一.前言 由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下拉复选框,主要就是继承 QComboBox 类,然后将复选框 QCheckBox 加入其中,并实现相应的功能. 最终实现的下拉复选框效果如下: 二.代码实现 1.主要方法 在 PyQt5 中,有几个主要的方法需要了解一下,方法名称和对应的含义如下: QtWidgets.QComboBox.setVi