news 2026/3/2 15:28:38

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

作者头像

张小明

前端开发工程师

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/2/28 4:57:39

Java Web 甘肃旅游服务平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着甘肃省旅游业的快速发展&#xff0c;传统的旅游服务模式已无法满足游客日益增长的个性化需求。游客在规划行程时面临信息分散、服务不连贯等问题&#xff0c;亟需一个高效、智能的旅游服务平台整合资源。甘肃旅游服务平台系统旨在通过数字化手段解决这些问题&#xff…

作者头像 李华
网站建设 2026/3/1 0:32:14

AutoGPT在学术论文写作中的辅助功能:引言与方法部分草稿生成

AutoGPT在学术论文写作中的辅助功能&#xff1a;引言与方法部分草稿生成 在撰写一篇关于“基于深度学习的医学图像分割”的论文时&#xff0c;你是否曾花费数小时查阅文献、整理研究现状、反复修改引言段落&#xff1f;这种高度结构化却又极其耗时的任务&#xff0c;正是许多科…

作者头像 李华
网站建设 2026/2/26 1:17:21

34、构建 SQL Server on Linux 的高度可用 Always On 可用性组

构建 SQL Server on Linux 的高度可用 Always On 可用性组 1. 前期回顾与新目标 当一切顺利时, cowboysrule 会出现在列表中。由于之前创建可用性组时使用了 SECONDARY_ROLE 选项,甚至可以从辅助副本的 cowboysrule 数据库读取数据。至此,已经成功为 Linux 上的 SQL…

作者头像 李华
网站建设 2026/2/27 5:21:38

42、SQL Server 数据库迁移指南

SQL Server 数据库迁移指南 1. 使用 BACPAC 文件进行导出和导入 将现有 SQL Server 数据库迁移到 Linux 上的 SQL Server 时,BACPAC 文件是一种可行的选择。BACPAC 文件是一种数据层包文件,具有很强的可移植性,可用于迁移到其他平台,如 Azure。它包含数据库的定义、架构、…

作者头像 李华
网站建设 2026/2/22 9:47:52

18、PHP网络与协议函数使用指南

PHP网络与协议函数使用指南 1. 协议概述 协议是特定情况下的通信规则,就像人与人见面有打招呼、握手等流程,计算机网络协议也类似。不同的计算机协议用于不同的场景和应用,常见的有: - HTTP(超文本传输协议) :用于发送和接收网页。 - FTP(文件传输协议) :用于…

作者头像 李华