news 2026/4/30 8:11:16

初始化 → 用户操作 → 已选列表更新 → 事件传递父组件 → 保存历史的整个数据流详细介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
初始化 → 用户操作 → 已选列表更新 → 事件传递父组件 → 保存历史的整个数据流详细介绍
import{Component,OnInit,Output,EventEmitter}from'@angular/core';@Component({selector:'app-scheduling-filter',// 组件选择器,用于在父组件模板中使用 <app-scheduling-filter>templateUrl:'./scheduling-filter.component.html',styleUrls:['./scheduling-filter.component.css']})exportclassSchedulingFilterComponentimplementsOnInit{@Output()appliedFilter=newEventEmitter<any>();// 子组件向父组件发射事件,传递用户选择的过滤条件// 父组件可以在模板中通过 (appliedFilter)="父组件方法($event)" 监听// 模拟 Test Type 数据testTypeList=[{name:'BDS',value:'BDS',checked:false},{name:'DRE',value:'DRE',checked:false},{name:'MRI',value:'MRI',checked:false}];// 每个测试类型包含 name、value 和 checked 属性// checked 用于控制 checkbox 是否选中selectedTestType:any[]=[];// 用户选中的测试类型列表searchedTestType:any[]=[];// 可以用于搜索过滤后的列表(当前例子初始化为全量列表)previousAppliedFilters:any={testType:['BDS']// 模拟历史选中的测试类型};ngOnInit():void{// 生命周期钩子,组件初始化时执行if(this.previousAppliedFilters.testType?.length){// 如果有历史选中值,则初始化 selectedTestTypethis.selectedTestType=this.previousAppliedFilters.testType.map((t:any)=>{if(typeoft==='string')return{name:t,value:t,checked:true};// 字符串类型,生成对象并标记 checkedif(t?.name)return{...t,checked:true};// 已是对象类型,保持原属性并标记 checkedreturnnull;// 其他情况过滤掉}).filter(Boolean);// 去掉 null 或 undefined// 同步 testTypeList 的 checked 状态,确保页面显示正确this.testTypeList.forEach(item=>{item.checked=this.selectedTestType.some(sel=>sel.name===item.name);// some() 判断 selectedTestType 中是否存在该 name});// 初始化搜索列表(目前为全量 testTypeList)this.searchedTestType=[...this.testTypeList];}}onChecked(event:any,selectedFilter:string){// 用户点击 checkbox 时触发// event -> 当前点击的测试类型对象// selectedFilter -> 类型标识,例如 'testType'consttargetList=selectedFilter==='testType'?this.selectedTestType:[];// 选择要操作的目标数组(这里是 selectedTestType),方便扩展其他 filter 类型this.testTypeList.forEach(item=>{if(item.name===event.name){item.checked=!item.checked;// 切换 checkbox 状态}});// 更新 selectedTestType,只保留 checked = true 的项this.selectedTestType=this.testTypeList.filter(item=>item.checked);}removeTestType(item:any){// 点击已选项的 × 按钮,取消选中item.checked=false;// 取消 checkboxthis.selectedTestType=this.selectedTestType.filter(sel=>sel.name!==item.name);// 更新 selectedTestType}applyFilter(){// 点击 Apply Filter 按钮,向父组件传递数据console.log('Apply Filter Selected:',this.selectedTestType);this.appliedFilter.emit({testType:this.selectedTestType.map(t=>({...t}))// 浅拷贝对象,防止父组件修改子组件数据});// 保存历史选中,供下次初始化恢复this.previousAppliedFilters.testType=this.selectedTestType.map(t=>t.name);}}
<div><h3>Test Type Filter</h3><!--遍历 testTypeList 显示 checkbox--><div*ngFor="let item of testTypeList"><input type="checkbox"[checked]="item.checked"<!--根据对象 checked 属性控制 checkbox 是否选中-->(change)="onChecked(item, 'testType')"/><!--点击 checkbox 调用 onChecked-->{{item.name}}</div><!--显示已选中的测试类型--><div><h4>Selected Test Types:</h4><span*ngFor="let item of selectedTestType">{{item.name}}<button(click)="removeTestType(item)">×</button><!--点击 × 调用 removeTestType--></span></div><!--应用过滤条件按钮--><button(click)="applyFilter()">Apply Filter</button></div>

解释:

  1. this.previousAppliedFilters.testType
  • 表示之前保存的已选测试类型,比如:[‘BDS’]
  1. .map((t: any) => { … })
  • 遍历历史数组,把历史值转换为 标准对象格式,并标记 checked: true

  • 逻辑:

    • 如果 t 是字符串 → 转为对象 { name: t, value: t, checked: true }

    • 如果 t 已经是对象且有 name → 保留原对象,并加上 checked: true

    • 其他情况 → 返回 null

  1. .filter(Boolean)
  • 过滤掉 null 或 undefined

  • 结果:selectedTestType 只包含有效对象

业务逻辑:把历史选中项标准化为 { name, value, checked } 结构,并记录选中状态,以便页面渲染。

2. 同步 testTypeList 的选中状态

item.checked=this.selectedTestType.some(sel=>sel.name===item.name);

解释:

  • 遍历原始 testTypeList

  • some(sel => sel.name === item.name)

    • 检查 selectedTestType 中是否有和当前 item 同名的选中项

    • 返回 true → 表示选中

    • 返回 false → 表示未选中

  • 赋值给 item.checked → 确保 checkbox 页面显示正确

✅ 业务逻辑:把历史选中状态同步到页面显示的 checkbox 上。

3. 触发事件向父组件传数据

this.appliedFilter.emit({testType:this.selectedTestType.map(t=>({...t}))// 深拷贝});

解释:

  1. this.appliedFilter

子组件定义的 @Output() 事件

父组件可以在模板中通过 (appliedFilter)=“onAppliedFilter($event)” 监听

  1. .emit({…})

发射事件,把数据传给父组件

  1. this.selectedTestType.map(t => ({ …t }))

把 selectedTestType 里的对象做 浅/深拷贝,防止父组件修改后影响子组件

这里使用 { …t } 复制对象属性

✅ 业务逻辑:将当前选中的测试类型传递给父组件,让父组件知道用户选择了哪些项。

4. 保存历史选中

this.previousAppliedFilters.testType=this.selectedTestType.map(t=>t.name);

解释:

  • selectedTestType.map(t => t.name) → 只取名称数组

  • 保存到 previousAppliedFilters.testType

  • 这样下次组件初始化时可以恢复用户的历史选择

✅ 业务逻辑:记录用户选择,支持刷新或重新打开页面时保留历史状态。

5. 数据传递流程总结

  1. 初始化:

读取 previousAppliedFilters.testType

转换成 { name, value, checked } 对象

更新 selectedTestType 和 testTypeList 的 checked

  1. 用户操作 checkbox:

(change) 触发 onChecked(item, ‘testType’)

切换 item.checked

更新 selectedTestType

  1. 删除已选项:

点击 × 调用 removeTestType(item)

取消 item.checked

更新 selectedTestType

  1. 应用筛选:

点击 Apply Filter 调用 applyFilter()

发射 appliedFilter 事件 → 父组件接收 $event

保存历史选中到 previousAppliedFilters.testType

可视化理解

历史选中->初始化 selectedTestType selectedTestType->同步 testTypeList.checked->页面 checkbox 显示 用户点击 checkbox->onChecked->切换 item.checked->更新 selectedTestType 用户点击 ×->removeTestType->更新 selectedTestType 用户点击 Apply Filter->appliedFilter.emit(selectedTestType)->父组件接收 selectedTestType->保存到 previousAppliedFilters.testType->下次初始化恢复

写法:

.map(…).filter(Boolean) → 格式化数组

.some(…) → 判断数组中是否存在某个元素

.map(t => ({ …t })) → 深拷贝对象

业务逻辑:

  1. 初始化历史选中

  2. 用户操作更新 selectedTestType

  3. 页面显示和数据状态同步

  4. 传递选中数据给父组件

  5. 保存历史选中供下次恢复

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 21:57:36

17、系统安全、文本编辑与特殊字符使用指南

系统安全、文本编辑与特殊字符使用指南 1. 系统日志管理 在大多数 BSD 系统中,很多系统活动都会被记录下来,这些活动日志会被写入 /var/log 目录或其子目录下的日志文件中,这项日志记录工作由 Syslog 工具完成。 1.1 FreeBSD 系统日志管理 FreeBSD 使用 syslogd (系…

作者头像 李华
网站建设 2026/4/25 16:30:04

36、SQL Server资源管理与数据库操作全解析

SQL Server资源管理与数据库操作全解析 1. 资源管理器(Resource Governor) 资源管理器能让服务器将资源限制映射到特定工作负载组和资源池的登录上。你可以在 这里 了解更多关于分类器函数的信息。 同事Travis Wright在GitHub上创建了一个简单易用的演示,展示了如何使用…

作者头像 李华
网站建设 2026/4/23 17:42:42

37、SQL Server 数据库管理与修复全解析

SQL Server 数据库管理与修复全解析 在 SQL Server 数据库管理中,涉及数据库的分离、附加、状态管理以及修复等多个关键操作。下面为你详细介绍这些操作的相关知识和技巧。 数据库分离与附加 当数据库处于无活动事务状态并被干净地分离,且存在多个事务日志文件时,SQL Ser…

作者头像 李华
网站建设 2026/4/28 14:15:37

ComfyUI工作流模板分享:节省80%重复劳动

ComfyUI工作流模板&#xff1a;让AI生成从“手工作坊”迈向工业化 在AI图像生成工具已经普及到几乎每个设计师电脑里的今天&#xff0c;很多人依然困在一个看似简单却极其耗时的问题上——每次换一个主题&#xff0c;就得重新点一遍按钮、调一遍参数、改一遍提示词。你有没有试…

作者头像 李华
网站建设 2026/4/23 13:45:22

Kotaemon框架为何成为GitHub热门项目?

Kotaemon框架为何成为GitHub热门项目&#xff1f; 在企业智能化浪潮席卷各行各业的今天&#xff0c;一个看似普通的开源对话框架——Kotaemon&#xff0c;悄然登上了GitHub趋势榜。它没有炫酷的界面&#xff0c;也不依赖某个明星模型&#xff0c;却在短短数月内吸引了大量开发者…

作者头像 李华
网站建设 2026/4/23 10:44:19

ComfyUI与MinIO对象存储集成:保存大体积生成文件

ComfyUI与MinIO对象存储集成&#xff1a;保存大体积生成文件 在AI图像生成日益普及的今天&#xff0c;一个看似简单却频繁困扰开发者的现实问题正浮出水面&#xff1a;单次Stable Diffusion推理可能产出数百张4K分辨率图像&#xff0c;累计达数GB数据。这些“数字资产”若仅依赖…

作者头像 李华