Angular Material Dialog传参报错,求删除确认弹窗正确实现方案
解决Angular Material删除确认弹窗数据传递问题
我来帮你搞定这个Angular Material弹窗的问题!你的核心问题是弹窗组件的模板没有正确引用传递过来的数据,还有几个细节需要调整,下面一步步来修正:
问题分析
- 模板引用错误:你在弹窗模板里直接用了
skill,但实际上传递的数据存在组件的data属性里(通过@Inject(MAT_DIALOG_DATA)注入的),必须用data.skill来访问 - 类型定义错误:
DialogData接口里的skill被定义成了空数组[],这不符合实际传递的单个技能对象,应该改为具体的Skill类型 - Observable处理错误:你把
subscribe的返回值(Subscription)赋值给了skills$,但async管道需要的是Observable,这会导致数据无法正常渲染 - 删除后逻辑优化:当前删除后直接导航到添加页面,用户体验不佳,应该留在列表页并刷新最新数据
解决方案
1. 定义/修正Skill和DialogData接口
先明确Skill类型(如果还没有的话),并修正DialogData的类型定义:
// 定义Skill接口,根据你的实际字段调整 export interface Skill { id: number; name: string; consultantId: number; // 添加其他你需要的字段 } export interface DialogData { skill: Skill; // 改成单个Skill对象,而非数组 }
2. 修正弹窗组件模板
把模板里的skill替换为data.skill,确保能正确访问传递过来的技能数据:
<div mat-dialog-content> <p>Are you sure you want to delete</p> <p>"{{data.skill.name}}" from skill list?</p> </div> <div mat-dialog-actions> <button mat-button (click)="onNoClick()">No Thanks</button> <button mat-button (click)="deleteSkill(data.skill.id, data.skill.consultantId)">Yes, I'm sure</button> </div>
3. 修正SkillListComponent中的Observable处理
skills$应该赋值为Observable,让async管道自动处理订阅逻辑:
ngOnInit(): void { this.sub = this.route.params.subscribe(params => { this.consultantId = Number(params['id']); // 直接把Observable赋值给skills$,async管道会自动处理订阅与取消订阅 this.skills$ = this.api.getAllSkills(this.consultantId); // 如果需要打印日志,单独订阅即可 this.skills$.subscribe(response => { console.log('Skills data:', response); }); }); }
4. 优化删除后的逻辑
删除成功后关闭弹窗,并通知父组件刷新技能列表,提升用户体验:
// 在DialogDeleteConfirm组件中 deleteSkill(skillId: number, consultantId: number) { this.api.deleteSkill(skillId).subscribe({ next: (response) => { console.log('DELETE skill response: ', response); // 关闭弹窗并传递删除成功的信号 this.dialogRef.close(true); }, error: (err) => { console.error('Delete failed:', err); // 可在此添加错误提示,比如用MatSnackBar } }); } // 在SkillListComponent的openDialog方法中 openDialog(skill: Skill){ const dialogRef = this.dialog.open(DialogDeleteConfirm,{ width: '250px', data: { skill } }); // 订阅弹窗关闭事件,删除成功后刷新技能列表 dialogRef.afterClosed().subscribe(result => { if (result) { this.skills$ = this.api.getAllSkills(this.consultantId); } }); }
5. 确保组件注册正确
确保DialogDeleteConfirm组件在你的Angular模块中被正确声明(Angular 9+无需entryComponents,但要加入declarations):
@NgModule({ declarations: [ SkillListComponent, DialogDeleteConfirm ], // Angular 8及以下版本需要添加以下配置 // entryComponents: [DialogDeleteConfirm] }) export class YourModule { }
这样修改后,你的删除确认弹窗就能正确显示技能名称,点击确认后也能正确删除并刷新列表了!
内容的提问来源于stack exchange,提问作者imkeVr
相关产品推荐
相关产品推荐

