news 2026/5/1 18:46:18

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

作者头像

张小明

前端开发工程师

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/30 16:52:27

AutoGPT与Ollama配合使用的完整流程:轻量化本地AI代理搭建

AutoGPT与Ollama配合使用的完整流程&#xff1a;轻量化本地AI代理搭建 在一台普通的笔记本电脑上&#xff0c;运行一个能自主规划、搜索信息、生成文档并自我调整的AI助手——这听起来像是科幻电影的情节。但今天&#xff0c;借助 AutoGPT 和 Ollama&#xff0c;这一切已经可以…

作者头像 李华
网站建设 2026/4/25 1:15:44

35、SQL Server 高可用性、灾难恢复及管理监控全解析

SQL Server 高可用性、灾难恢复及管理监控全解析 1. 自动页面修复 自动页面修复(Automatic Page Repair)是 SQL Server 可用性组(AG)的一项强大功能。在主副本上的数据库页面损坏时,辅助副本仍可能保留着有效的数据库页面。当主副本检测到 AG 中某个数据库的页面损坏(例…

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

39、SQL Server管理与监控全攻略

SQL Server管理与监控全攻略 1. 服务器端代码管理 在创建T - SQL服务器端代码(如存储过程、视图、函数和触发器)后,可能需要对其进行修改或删除。每种对象类型都支持与 CREATE 语法对应的 ALTER 和 DROP T - SQL版本。当对服务器端编程对象(如存储过程)执行 ALTE…

作者头像 李华
网站建设 2026/4/25 12:18:31

45、SQL Server 迁移与容器化应用实践

SQL Server 迁移与容器化应用实践 1. 数据库兼容性与向后兼容性 数据库兼容性可在一定程度上为应用程序的查询和功能提供向后兼容性保护。不同兼容性级别之间的行为差异可在文档 https://docs.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-compatibilit…

作者头像 李华
网站建设 2026/5/1 11:04:27

17、PHP与文件系统和服务器交互全解析

PHP与文件系统和服务器交互全解析 1. 文件上传简介 PHP 提供了强大的 HTTP 上传支持,允许文件从浏览器上传到服务器,而非传统的从服务器到浏览器。通常,我们会使用 HTML 表单来实现文件上传。以下是一个示例 HTML 表单: <!DOCTYPE html> <html> <head&g…

作者头像 李华
网站建设 2026/4/30 11:53:46

国内Docker镜像源推荐:快速拉取Kotaemon镜像提升部署效率

国内Docker镜像源推荐&#xff1a;快速拉取Kotaemon镜像提升部署效率 在构建企业级智能问答系统的今天&#xff0c;开发者常常被一个看似简单却极为恼人的问题拖慢节奏——docker pull 命令卡在 10% 长达半小时&#xff0c;甚至直接超时失败。尤其是在国内使用 Docker Hub 拉取…

作者头像 李华