You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:27:48