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

自定义SnackBar组件撤销逻辑开发问题:无法调用撤销函数

如何在自定义Angular Material SnackBar组件中实现撤销逻辑?

我来帮你解决这个问题——核心是要在自定义SnackBar组件和调用它的组件之间建立通信,让撤销按钮能触发外部的撤销逻辑。下面是具体的分步实现方案:

1. 修改SnackBar Service,支持传递撤销回调

首先更新你的showSnackbar方法,新增一个可选的回调参数,并把回调和消息一起放入data中传递给自定义组件:

showSnackbar(mes: string, undoCallback?: () => void){ 
  let snackRef = this.snackBar.openFromComponent(SnakebarComponent, { 
    duration: 2000, 
    data: { message: mes, undoCallback: undoCallback } 
  }); 
}

2. 更新自定义SnackBar组件,接收并调用回调

在你的SnakebarComponent里,从注入的MAT_SNACK_BAR_DATA中取出回调函数,在撤销按钮的点击事件里执行它(还可以注入MatSnackBarRef手动关闭SnackBar):

import { Component, Inject } from '@angular/core';
import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';

@Component({
  selector: 'app-snakebar',
  templateUrl: './snakebar.component.html',
  styleUrls: ['./snakebar.component.css']
})
export class SnakebarComponent {
  message: string;
  private undoCallback?: () => void;

  constructor(
    @Inject(MAT_SNACK_BAR_DATA) public data: any,
    private snackBarRef: MatSnackBarRef<SnakebarComponent>
  ) { 
    this.message = data.message;
    this.undoCallback = data.undoCallback;
  }

  onClick(){ 
    // 先执行外部传入的撤销逻辑(如果存在)
    if(this.undoCallback){
      this.undoCallback();
    }
    // 手动关闭SnackBar(可选,也可以依赖duration自动关闭)
    this.snackBarRef.dismiss();
  }
}

3. 在调用SnackBar的组件中传入具体撤销逻辑

在需要弹出SnackBar的业务组件里,传入你的实际撤销函数:

// 示例业务组件
import { Component } from '@angular/core';
import { SnackBarService } from './path-to-snackbar-service';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html'
})
export class YourComponent {
  constructor(private snackBarService: SnackBarService) {}

  // 比如执行删除操作后弹出SnackBar
  deleteItem(){
    // 执行删除逻辑...
    // 弹出带撤销选项的SnackBar
    this.snackBarService.showSnackbar('已删除该项', () => this.undoDelete());
  }

  // 具体的撤销逻辑
  private undoDelete(): void {
    // 这里写你需要的撤销操作,比如恢复删除的数据、回滚状态等
    console.log('恢复已删除的项');
  }
}

这样配置后,当用户点击SnackBar里的撤销按钮时,就会触发你在业务组件中定义的撤销函数,完美实现你想要的撤销逻辑。

内容的提问来源于stack exchange,提问作者Nishant Varshney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:28:22