自存使用angular selectionModel实现表格跨页勾选

根本是使用selectionModel,它本身储存的选中项就是一个能够不随切换分页而变化。这样太好了,

而表格的dataSource是会随分页变的,此前储存的选中项就匹配不上切换分页再切换回来的项。

要做的只是:

1.监听多选框选中的变化 ,储存它,并在切换分页后,把已经存好的拿出来。

2.再细节优化就是html上是否全选本页,通过在储存的选中项目加上pageIndex本页属性,就可以通过属性判断是否本页的来设置未决定状态

  1. component.ts
    import { SelectionModel } from "@angular/cdk/collections";
    import { MatTableDataSource } from "@angular/material/table";
    import { Component, OnInit } from "@angular/core";
    
    export class SingleCommodityManageComponent  implements OnInit {
      dataSource = new MatTableDataSource<any>([]);//表格
      selection = new SelectionModel<any>(true, []);
      selectedIds: any[] = []; // 存储选中项 ID 的数组
    
    
      ngOnInit(): void {
        this.queryCommidityInfo();
        this.selection.changed.subscribe((changes) => {
          const { added, removed } = changes;
    
          if (removed.length > 0) {
            // 创建一个 Set 来存储 removed 项的 comUUID
            const removedComUUIDs = new Set(removed.map((item) => item.comUUID));
    
            // 直接使用 filter 方法移除匹配的项,并创建一个新数组
            this.selectedIds = this.selectedIds.filter(
              (item) => !removedComUUIDs.has(item.comUUID)
            );
          }
    
          if (added.length > 0) {
            const addedItems = added.map((item) => ({
              comUUID: item.comUUID,
              pageIndex: this.options.pageIndex,
            }));
            this.selectedIds = this.selectedIds.concat(addedItems);
          }
        });
      }
    
    
      // 分页器变化
      paginatorChange(val) {
       // this.options.pageIndex = val.pageIndex;
        //this.options.numPerPage = val.pageSize;
        this.queryCommidityInfo();
      }
    
      // 分页查询商品信息
      queryCommidityInfo() {
     //...调接口
              this.reshowCheckedItems();//复显已勾选
     
      }
    
    
    
    // 多选函数
    
      /* 重新在页面显示之前已经添加到选中的项 */
      reshowCheckedItems() {
        this.dataSource.data.forEach((row) => {
          if (
            this.selectedIds.some(
              (selectedItem) => selectedItem.comUUID === row.comUUID//如果数据为被选中的
            )
          ) {
            const oldItem = this.selection.selected.find(//找到selected旧数据的项
              (item) => item.comUUID == row.comUUID
            );
            if (oldItem) {
              this.selection.deselect(oldItem); // 给原来的selected旧数据设置为不选中
            }
            this.selection.select(row); // 给新的dataSource设置为选中
          }
        });
      }
    
      /* 本页是否全选 */
      isThisPageAllSelected() {
        const numRows = this.dataSource.data.length;
        const thisPageSelected = this.selectedIds.filter(
          (item) => item.pageIndex == this.options.pageIndex
        ).length;
        return thisPageSelected === numRows;
      }
    
      /*  本页是否部分选择中 */
      isThisPageSomeSelected() {
        const isSomeSelected = this.selectedIds.some(
          //some() 方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试。如果在数组中找到一个元素使得提供的函数返回 true,则返回 true;否则返回 false
          (item) => item.pageIndex == this.options.pageIndex
        );
        return isSomeSelected;
      }
    
      /*本页全选*/
      masterToggle() {
        if (this.isThisPageAllSelected()) {
          const thisPageSelectedIds = new Set(
            this.selectedIds
              .filter((item) => item.pageIndex === this.options.pageIndex)
              .map((item) => item.comUUID) //集合(Set) 是一种用于存储一组不同元素的数据结构
          ); //获取当前页码
    
          this.selection.selected.forEach((selectedItem) => {
            if (thisPageSelectedIds.has(selectedItem.comUUID)) {
              this.selection.deselect(selectedItem); //取消选中
            }
          });
          return;
        }
    
        this.selection.select(...this.dataSource.data);
      }
    }

 2.html

          <table mat-table [dataSource]="dataSource" class="mat-elevation-z0">
            <ng-container matColumnDef="select">
              <th mat-header-cell *matHeaderCellDef>
                <mat-checkbox
                  color="primary"
                  (click)="$event.stopPropagation()"
                  (change)="$event ? masterToggle() : null"
                  [checked]="selection.hasValue() && isThisPageAllSelected()"
                  [indeterminate]="
                    isThisPageSomeSelected() && !isThisPageAllSelected()
                  "
                >
                </mat-checkbox>
              </th>
              <td mat-cell *matCellDef="let row">
                <mat-checkbox
                  color="primary"
                  (click)="$event.stopPropagation()"
                  (change)="$event ? selection.toggle(row) : null"
                  [checked]="selection.isSelected(row)"
                >
                </mat-checkbox>
              </td>
            </ng-container>


            <tr mat-header-row *matHeaderRowDef="tableColumnArr"></tr>
            <tr
              mat-row
              *matRowDef="let row; columns: tableColumnArr"
              (click)="selection.toggle(row)"
            ></tr>
          </table>
          <div class="d-flex flex-row align-items-center">
            <div>
              已选中:{{ this.selectedIds.length }}
              <span class="ml-3"> 全部:{{ this.options.totalCount }}</span>
            </div>

            <div class="spacer"></div>
            <mat-paginator
              showFirstLastButtons
              [pageSizeOptions]="pageSizeOptions"
              [length]="options.totalCount"
              [pageIndex]="options.pageIndex"
              [pageSize]="options.numPerPage"
              (page)="paginatorChange($event)"
            ></mat-paginator>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/633313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】之【Bug】C2001 常量中有换行符

分析 参考&#xff1a;Qt记录&#xff1a;Qt编程遇C2001错误&#xff0c;提示“常量中有换行符”_qt 常量中有换行符-CSDN博客 原因 字符串中有中文字符 &#xff1a;使用了中文标点符号&#xff01; 解决 中文感叹号改为英文的

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

RisingWave 用户定义函数 (一) :概览

&#xff5c;作者&#xff1a;王润基 RisingWave Labs 内核开发工程师 用户定义函数&#xff08;User Defined Function&#xff0c;以下简称 UDF&#xff09;是数据系统中的常见功能。它允许用户使用各种语言定义自己的函数&#xff0c;作为内置函数的补充&#xff0c;以实现…

【前端】使用 Canvas 实现贪吃蛇小游戏

使用 Canvas 实现贪吃蛇小游戏 在这篇博客中&#xff0c;我们将介绍如何使用 HTML5 Canvas 和 JavaScript 实现一个简单的贪吃蛇&#xff08;Snake&#xff09;小游戏。这个项目是一个基础的游戏开发练习&#xff0c;它可以帮助你理解如何在 Canvas 上绘图、如何处理用户输入以…

【九十三】【算法分析与设计】719. 找出第 K 小的数对距离,N 台电脑的最长时间,二分答案法

719. 找出第 K 小的数对距离 - 力扣&#xff08;LeetCode&#xff09; 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.le…

校园网拨号上网环境下多开虚拟机,实现宿主机与虚拟机互通,并访问外部网络

校园网某些登录客户端只允许同一时间一台设备登录&#xff0c;因此必须使用NAT模式共享宿主机的真实IP&#xff0c;相当于访问外网时只使用宿主机IP&#xff0c;此方式通过虚拟网卡与物理网卡之间的数据转发实现访问外网及互通 经验证&#xff0c;将centos的物理地址与主机物理…

UMPNet: Universal Manipulation Policy Network for Articulated Objects

1. 摘要 UMPNet是一个基于图像的策略网络&#xff0c;能够推理用于操纵铰接物体的闭环动作序列。该策略支持6DoF动作表示和可变长度轨迹。 为处理多种类的物体&#xff0c;该策略从不同的铰接结构中学习&#xff0c;并泛化到未见过的物体或类别上。该策略是以自监督探索的方式…

利用Python队列生产者消费者模式构建高效爬虫

目录 一、引言 二、生产者消费者模式概述 三、Python中的队列实现 四、生产者消费者模式在爬虫中的应用 五、实例分析 生产者类&#xff08;Producer&#xff09; 消费者类&#xff08;Consumer&#xff09; 主程序 六、总结 一、引言 随着互联网的发展&#xff0c;信…

css使用clip-path裁剪出不规则图形并绑定点击事件

点击图片的红色区域触发事件 点击图片黑色不触发点击事件&#xff0c;代码演示效果如下&#xff1a; 代码演示效果 1.png&#xff08;尺寸 200*470&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

2025第十届美陈展

展位又遭疯抢&#xff01;2025第十届美陈展释放“无界之美” 美是全球通用的语言&#xff0c;人类对美的追求始终如一&#xff0c;大众审美在经历了时代的变迁后开始趋同&#xff0c;东方文明深处的美学经济开始崛起。 在如今商业迈入存量阶段&#xff0c;以品牌为突破口打造…

抽象工厂模式(AbstractFactoryPattern)

文章目录 1.抽象工厂模式定义2.UML类图3.抽象工厂模式具体实现工厂模式实现单一产品族抽象工厂实现多产品族产品类工厂类使用 4.抽象工厂模式优缺点 1.抽象工厂模式定义 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 工厂方法模式是单一产…

JavaScript-运算符

算术运算符 返回结果为数字型的运算符 加法运算符 加法运算符&#xff08;&#xff09;是一个二元运算符&#xff0c;可以对两个数字型的操作数进行相加运算&#xff0c;返回值是两个操作数的和 减法运算符 减法运算符&#xff08;-&#xff09;是一个二元运算符&#xff0c;可…

banner2.0自定义轮播布局

说明&#xff1a;最近碰到一个需求&#xff0c;让新闻列表实现轮播图的效果&#xff0c;也就是轮播新闻&#xff0c;然后样式必须按照ui设计的样式来弄&#xff0c;之前传统的banner&#xff0c;都是只轮播图片&#xff0c;没想到&#xff0c;这次居然要轮播新闻&#xff0c; 网…

【深度学习】YOLOv8训练,交通灯目标检测

文章目录 一、数据处理二、环境三、训练 一、数据处理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…

java+ vue.js+uniapp一款基于云计算技术的企业级生产管理系统,云MES源码 MES系统如何与ERP系统集成?

java vue.jsuniapp一款基于云计算技术的企业级生产管理系统&#xff0c;云MES源码&#xff0c;MES系统如何与ERP系统集成&#xff1f; MES系统&#xff08;制造执行系统&#xff09;与ERP系统&#xff08;企业资源规划系统&#xff09;的集成可以通过多种方式实现&#xff0c;这…

【git】开发提交规范(feat、fix、perf)

这段时间收到的需求很多&#xff0c;可能是临近两周一次的大版本灰度上线&#xff0c;这次产生了一个关于git的思考&#xff0c;就是各个版本之间怎么管理的问题&#xff0c;这里做出我自己的一些方法。 首先&#xff0c;既然已经明确了remote分支中的release分支为主分支&…

Java中transient关键字

transient介绍 在Java中&#xff0c;transient是一个关键字&#xff0c;用于声明一个字段在序列化过程中应该被忽略。当一个对象被序列化时&#xff0c;它的状态&#xff08;即其字段的值&#xff09;通常会被保存到字节流中&#xff0c;以便稍后可以反序列化恢复对象的状态。…

如何使用Matlab进行三角剖分(自定义函数实现delaunayTriangulation 使用Bowyer-Watson 算法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Delaunay三角形 二、使用步骤 1.Bowyer-Watson算法 2.算法步骤 三、动画演示 四、核心代码 五、对比matlab自带函数和我们的算法&#xff1a; 总结 前…

巨某量引擎后台登录实战笔记 | Playwright自动化框架

前言 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 入正题看看滑块是怎么个事…

CasaOS系统玩客云安装内网穿透工具实现无公网IP远程访问

文章目录 前言1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 前言 2月底&#xff0c;玩客云APP正式停止运营&#xff0c;不再提供上传、云添加功能。3月初&#xff0c;有用户进行了测试&#xff0c;局域网内的各种服务还能继续使用&am…