news 2026/6/15 17:38:55

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

作者头像

张小明

前端开发工程师

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/6/15 11:30:53

19、探索Mac OS X下的Perl编程:从入门到网站链接检查实践

探索Mac OS X下的Perl编程:从入门到网站链接检查实践 1. Perl简介 Perl是Larry Wall在20世纪80年代末发明的编程语言。当时,他需要一种比shell脚本功能更强大,但又比C等结构化语言更灵活的语言,于是Perl应运而生。Perl是一种让人又爱又恨的语言,很少有人对它持中立态度。…

作者头像 李华
网站建设 2026/6/15 2:32:36

SpringBoot+Vue 房屋租赁管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着城市化进程的加快和人口流动性的增加&#xff0c;房屋租赁市场需求持续增长&#xff0c;传统的手工管理方式已无法满足高效、便捷的租赁管理需求。房屋租赁管理系统通过信息化手段整合房源信息、租客数据及合同管理&#xff0c;有效提升租赁业务的透明度和效率。该系统…

作者头像 李华
网站建设 2026/6/15 11:26:15

23、构建用户认证与个性化推荐系统

构建用户认证与个性化推荐系统 在当今的互联网应用中,用户认证和个性化服务是提升用户体验的关键要素。我们将构建一个名为 PHPBookmark 的在线书签系统,它能让用户注册、登录,存储个人书签,并根据用户偏好推荐其他可能感兴趣的网站。 项目需求与功能概述 我们要实现的系…

作者头像 李华
网站建设 2026/6/12 20:03:29

31、PHP与MySQL安装指南

PHP与MySQL安装指南 1. 运行PHP的方式 PHP解释器可以作为模块或单独的CGI二进制文件运行。通常,出于性能考虑会使用模块版本。不过,在没有模块版本的服务器上,或者为了让Apache用户能以不同用户ID运行不同的PHP页面,有时会使用CGI版本。此外,易于使用的Windows安装程序采…

作者头像 李华
网站建设 2026/6/14 13:58:04

企业级福泰轴承股份有限公司进销存系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着制造业数字化转型的加速&#xff0c;企业对高效、精准的进销存管理需求日益增长。传统的手工记录和单机版管理系统已无法满足现代企业的业务需求&#xff0c;尤其在库存管理、订单跟踪和数据分析方面存在效率低下、数据孤岛等问题。福泰轴承股份有限公司作为一家专注于…

作者头像 李华
网站建设 2026/6/15 7:33:01

9、资源、产品与信息系统的虚拟化

资源、产品与信息系统的虚拟化 1. 协作产品和资源工作负载的虚拟化 在分布式制造执行系统(MES)层,本地工作负载直接连接到工厂的物理实体,即当前正在执行的资源和产品。对这些实体进行虚拟化,能够以池模型在运行时管理硬件和软件控制资源,使多个受益方(产品订单)可按…

作者头像 李华