[Angular] 主从表结构,从表记录在主表固定栏位上呈现

news2024/11/25 1:42:42

Background

主从表结构,有时为了方便数据呈现,在UI上不显示从表资料,那么需要动态把从表的资料加载到主表的固定栏位上。

例如:主表是人员信息,从表是银行卡信息,一个人在同一家银行可能有多张银行卡,且一个人可能在多家银行开户。

How to implement? 

1. Provided data list of person and bank account informaciton

a. Person information

personData: any[] = [
    {
      key: '1',
      name: 'John Brown',
      age: 32,
      address: 'New York No. 1 Lake Park'
    },
    {
      key: '2',
      name: 'Jim Green',
      age: 42,
      address: 'London No. 1 Lake Park'
    },
    {
      key: '3',
      name: 'Joe Black',
      age: 32,
      address: 'Sidney No. 1 Lake Park'
    }
  ];

b. Bank list

  banks = [
    { code: 'icbc', name: '工行' },
    { code: 'abc', name: '农行' },
    { code: 'ccb', name: '建行' },
    { code: 'bocom', name: '交行' },
    { code: 'boc', name: '中行' }
  ];

 c. Bank account list

  bankAccounts: BankAccount[] = [
    { key: '1', account: '1-工行001', bank: 'icbc' },
    { key: '2', account: '2-交行001', bank: 'bocom' },
    { key: '3', account: '3-建行001', bank: 'ccb' },
    { key: '3', account: '3-农行001', bank: 'abc' },
    { key: '1', account: '1-农行001', bank: 'abc' },
    { key: '1', account: '1-农行002', bank: 'abc' },
    { key: '2', account: '2-工行001', bank: 'icbc' },
    { key: '1', account: '1-工行002', bank: 'icbc' }
  ];

2. Interface

a. Person

interface Person {
  key: string;
  name: string;
  age: number;
  address: string;
  icbc: string;
  abc: string;
  ccb: string;
  bocom: string;
  boc: string;
}

b. Bank account

interface BankAccount {
  key: string;
  account: string;
  bank: string;
}

3. Implementation method

const refList = this.bankAccounts;
    const refType = this.banks;

    // 循环主表
    for (let item of this.personData) {
      //循环从表需显示在主表呈现的类型
      refType.forEach(typ => {
        const accoutsOfBank = refList.filter(o => o.key === item.key && o.bank === typ.code); //[{}]
        let accounts = '';
        // 按从表类型把资料合并
        for (const element of accoutsOfBank) {
          accounts += `${element.account};`;
        }
        // 根据从表类型,把合并的资料更新至主表固定栏位上
        switch (typ.code) {
          case 'icbc':
            item.icbc = accounts;
            break;
          case 'abc':
            item.abc = accounts;
            break;
          case 'ccb':
            item.ccb = accounts;
            break;
          case 'bocom':
            item.bocom = accounts;
            break;
          case 'boc':
            item.boc = accounts;
            break;
          default:
            break;
        }
      });
    }

4. The full source code

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

import { NzDividerModule } from 'ng-zorro-antd/divider';
import { NzTableModule } from 'ng-zorro-antd/table';

interface Person {
  key: string;
  name: string;
  age: number;
  address: string;
  icbc: string;
  abc: string;
  ccb: string;
  bocom: string;
  boc: string;
}

interface BankAccount {
  key: string;
  account: string;
  bank: string;
}

@Component({
  selector: 'app-pages-sample-master-detail',
  template: `
    <p>
      主从表结构,有时为了方便数据呈现,在UI上不显示从表资料,那么需要动态把从表的资料加载到主表的固定栏位上。
      例如:主表是人员信息,从表是银行卡信息,一个人在同一家银行可能有多张银行卡,且一个人可能在多家银行开户。
    </p>
    <nz-table #basicTable [nzData]="personData">
      <thead>
        <tr>
          <th>Name</th>
          <th>Age</th>
          <th>Address</th>
          <th *ngFor="let bank of banks">{{ bank.name }}</th>
          <th>Action</th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let data of basicTable.data">
          <td>{{ data.name }}</td>
          <td>{{ data.age }}</td>
          <td>{{ data.address }}</td>
          <td>{{ data.icbc }}</td>
          <td>{{ data.abc }}</td>
          <td>{{ data.ccb }}</td>
          <td>{{ data.bocom }}</td>
          <td>{{ data.boc }}</td>
          <td>
            <a>Action 一 {{ data.name }}</a>
            <nz-divider nzType="vertical"></nz-divider>
            <a>Delete</a>
          </td>
        </tr>
      </tbody>
    </nz-table>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  standalone: true,
  providers: [],
  imports: [NzTableModule, NzDividerModule, NgFor]
})
export class MasterDetailComponent implements OnInit {
  personData: any[] = [
    {
      key: '1',
      name: 'John Brown',
      age: 32,
      address: 'New York No. 1 Lake Park'
    },
    {
      key: '2',
      name: 'Jim Green',
      age: 42,
      address: 'London No. 1 Lake Park'
    },
    {
      key: '3',
      name: 'Joe Black',
      age: 32,
      address: 'Sidney No. 1 Lake Park'
    }
  ];

  banks = [
    { code: 'icbc', name: '工行' },
    { code: 'abc', name: '农行' },
    { code: 'ccb', name: '建行' },
    { code: 'bocom', name: '交行' },
    { code: 'boc', name: '中行' }
  ];

  bankAccounts: BankAccount[] = [
    { key: '1', account: '1-工行001', bank: 'icbc' },
    { key: '2', account: '2-交行001', bank: 'bocom' },
    { key: '3', account: '3-建行001', bank: 'ccb' },
    { key: '3', account: '3-农行001', bank: 'abc' },
    { key: '1', account: '1-农行001', bank: 'abc' },
    { key: '1', account: '1-农行002', bank: 'abc' },
    { key: '2', account: '2-工行001', bank: 'icbc' },
    { key: '1', account: '1-工行002', bank: 'icbc' }
  ];

  constructor() {}

  ngOnInit(): void {
    const refList = this.bankAccounts;
    const refType = this.banks;

    // 循环主表
    for (let item of this.personData) {
      //循环从表需显示在主表呈现的类型
      refType.forEach(typ => {
        const accoutsOfBank = refList.filter(o => o.key === item.key && o.bank === typ.code); //[{}]
        let accounts = '';
        // 按从表类型把资料合并
        for (const element of accoutsOfBank) {
          accounts += `${element.account};`;
        }
        // 根据从表类型,把合并的资料更新至主表固定栏位上
        switch (typ.code) {
          case 'icbc':
            item.icbc = accounts;
            break;
          case 'abc':
            item.abc = accounts;
            break;
          case 'ccb':
            item.ccb = accounts;
            break;
          case 'bocom':
            item.bocom = accounts;
            break;
          case 'boc':
            item.boc = accounts;
            break;
          default:
            break;
        }
      });
    }

    console.log(this.personData);
  }
}

5. Test result

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes.Service—使用源 IP

使用源 IP 运行在 Kubernetes 集群中的应用程序通过 Service 抽象发现彼此并相互通信&#xff0c;它们也用 Service 与外部世界通信。 本文解释了发送到不同类型 Service 的数据包的源 IP 会发生什么情况&#xff0c;以及如何根据需要切换此行为。 准备开始 术语表 本文使用…

大模型开发(十二):Function calling 流程优化并实现多轮对话任务

全文共1w余字&#xff0c;预计阅读时间约25~40分钟 | 满满干货(附代码案例)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;围绕Chat模型的Function calling功能进行更高层次的函数封装&#xff0c;并实现一个能够调用外部函数的多轮对话任务 写在前面&#xff1a;本文…

Vue系列第四篇:Vue2 + Element开发登录页面

Vue开发中Element是一个比较受欢迎的界面库&#xff0c;实际开发中Vue2搭配Element UI开发&#xff0c;Vue3搭配Element plus开发&#xff0c;今天就用Vue2 Element来开发登录页面。 目录 1.Element UI介绍 1.1官网 1.2element-ui安装 2.开发环境准备 2.1core-js安装 2…

20230724将真我Realme手机GT NEO3连接到WIN10的电脑的步骤

20230724将真我Realme手机GT NEO3连接到WIN10的电脑的步骤 2023/7/24 23:23 缘起&#xff1a;因为找使用IMX766的手机&#xff0c;找到Realme手机GT NEO3了。 同样使用IMX766的还有&#xff1a;Redmi Note12Pro 5G IMX766 旗舰影像 OIS光学防抖 OLED柔性直屏 8GB256GB时光蓝 现…

C语言 strlen()函数

一、strlen&#xff08;&#xff09;函数的简介 strlen函数&#xff1a;计算的是字符串str的长度&#xff0c;从字符的首地址开始遍历&#xff0c;以 \0 为结束标志&#xff0c;然后将计算的长度返回&#xff0c;计算的长度并不包含\0。下面是库中的strlen&#xff08;&#xf…

Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务

作者&#xff1a;刘军 全新升级的 Triple 协议 在微服务协议选型方面我们看到越来越多的应用从 Dubbo2 TCP 二进制协议迁移到 Dubbo3 Triple 协议 (兼容 gRPC)&#xff0c;以充分利用 Triple 的高效、全双工、Streaming 流式通信模型等能力&#xff1b;TripleHTTP/2 的组合很…

内存函数讲解

&#x1f495;"痛苦难以避免&#xff0c;而磨难可以选择。"-->村上春树&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据在内存中的存储 内存函数就是管理内存数据的函数&#xff0c;包含于头文件<string.h>中 1.memcpy函数-->内存…

线程池使用时需注意的一些问题

1、正确声明线程池 线程池必须手动通过 ThreadPoolExecutor 的构造函数来声明&#xff0c;避免使用Executors 类创建线程池&#xff0c;会有 OOM 风险。 Executors 返回线程池对象的弊端如下(后文会详细介绍到)&#xff1a; FixedThreadPool 和 SingleThreadExecutor &#xf…

设备JS二次开发指南

设备JS ES6二次开发 #新增设备类 在kiosk-cli-2nd的平台目录下,有摄像头二次开发增加接口示例,继承已有的摄像头类,如下图所示: 在该路径下新建一个设备js文件,如新增密码键盘的设备js:pinpad-2nd.js (1)导入平台设备js import { Device } from @/platform/lib/plat…

Android 海外版本中远程仓库无法拉取问题

在处理海外版本时 &#xff0c;经常遇到远程仓库无法加载的问题&#xff0c;是网络问题导致的。要么&#xff0c;公司运维搭建可翻墙的梯子&#xff0c;或其他的方式避开限制。 还有一种方式&#xff0c;是找到网站对应的ip &#xff0c;在host 中配置&#xff0c;便可绕开限制…

python_day14

导包 from pyspark import SparkConf, SparkContext import osos.environ["PYSPARK_PYTHON"] "D:/dev/python/python3.10.4/python.exe" conf SparkConf().setMaster("local[*]").setAppName("test_spark") sc SparkContext(confc…

【Node.js】低代码管理系统源码:只需点击鼠标,搭建属于你的企业应用

低代码管理系统是一种通过可视化界面和简化的开发工具&#xff0c;使非专业开发人员能够快速构建和管理应用程序的系统。它提供了一套预先定义的组件和模块&#xff0c;使用户可以通过拖放操作来设计应用程序的界面和逻辑。低代码管理系统还提供了自动化的工作流程、数据管理和…

策略模式的实现与应用:掌握灵活算法切换的技巧

文章目录 常用的设计模式有以下几种&#xff1a;一.创建型模式&#xff08;Creational Patterns&#xff09;&#xff1a;二.结构型模式&#xff08;Structural Patterns&#xff09;&#xff1a;三.行为型模式&#xff08;Behavioral Patterns&#xff09;&#xff1a;四.并发…

【RabbitMQ(day1)】RabbitMQ的概述和安装

入门RabbitMQ 一、RabbitMQ的概述二、RabbitMQ的安装三、RabbitMQ管理命令行四、RabbitMQ的GUI界面 一、RabbitMQ的概述 MQ&#xff08;Message Queue&#xff09;翻译为消息队列&#xff0c;通过典型的【生产者】和【消费者】模型&#xff0c;生产者不断向消息队列中生产消息&…

macOS Ventura 13.5 (22G74) Boot ISO 原版可引导镜像下载

macOS Ventura 13.5 (22G74) Boot ISO 原版可引导镜像下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Lin…

css终极方案PostCSS

一见如故 原理 所有的css框架都在一样的事&#xff0c;那就是由一个css生成一个新的css&#xff0c;那么postcss就来做了一个抽离&#xff1a; 1、将原有的css解析成抽象语法树 2、中间经过若干个插件 3、重新文本化&#xff0c;形成新的css postcss.config.js module.expor…

MX Linux 23 RC1发布

导读MX Linux的开发者宣布MX Linux 23的第一个候选版本已经发布。 MX Linux 是基于 Debian 稳定分支的面向桌面的 Linux 发行&#xff0c;它是 antiX 及早先的 MEPIS Linux 社区合作的产物。它采用 Xfce 作为默认桌面环境&#xff0c;是一份中量级操作系统&#xff0c;并被设计…

技术速览|Meta Llama 2 下一代开源大型语言模型

AI 使用大型语言模型&#xff08;LLM&#xff09;来理解和生成自然语言。LLM 可以从大量文本中学习并创建有关各种主题的文本&#xff0c;并可以完成比如编写代码、生成歌词、总结文章等任务。但有些 LLM 相关课程成本高昂且封闭&#xff0c;而现有的开放课程数量十分有限。这就…

游戏引擎UE如何革新影视行业?创意云全面支持UE云渲染

虚幻引擎UE&#xff08;Unreal Engine&#xff09;作为一款“殿堂级”的游戏引擎&#xff0c;占据了全球80%的商用游戏引擎市场&#xff0c;但如果仅仅将其当做游戏开发的工具&#xff0c;显然是低估了它的能力。比如迪士尼出品的电视剧《曼达洛人》、电影《狮子王》等等都使用…

Server - 调用 K8S 集群 GPU 环境运行算法脚本

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131899662 Kubeflow 是基于 Kubernetes 的机器学习工具包&#xff0c;提供了一套技术栈&#xff0c;包含了很多组件&#xff0c;用于支持…