MatSnackBar 是一个用来显示快餐栏通知的服务。

快餐栏可以包含一个字符串消息或指定的组件。

// Simple message.
let snackBarRef = snackBar.open('Message archived');

// Simple message with an action.
let snackBarRef = snackBar.open('Message archived', 'Undo');

// Load the given component into the snackbar.
let snackBarRef = snackBar.openFromComponent(MessageArchivedComponent);

无论哪种形式,都会返回一个 MatSnackBarRef。它可以用来关闭快餐栏或在快餐栏关闭时接收通知。 对于只有一个操作的简单消息,当该动作被触发时,MatSnackBarRef 会暴露出一个 Observable。 如果你要关闭一个用 openFromComponent 打开的自定义快餐栏,可以在该组件中注入一个 MatSnackBarRef

snackBarRef.afterDismissed().subscribe(() => {
  console.log('The snackbar was dismissed');
});


snackBarRef.onAction().subscribe(() => {
  console.log('The snackbar action was triggered!');
});

snackBarRef.dismiss();

可以调用由 open 调用返回的 MatSnackBarRef 中的 dismiss 方法来手动关闭快餐栏。

同一时刻只能打开一个快餐栏。如果在显示前一个消息时打开一个新的快餐栏,老的消息就会自动关闭。

快餐栏还可以通过一个可选的配置对象来指定持续时间:

snackBar.open('Message archived', 'Undo', {
  duration: 3000
});

你可以传入 data 属性,来与 openFromComponent 打开的自定义快餐栏共享数据。

snackBar.openFromComponent(MessageArchivedComponent, {
  data: 'some data'
});

要在组件中访问该数据,可以使用依赖注入令牌 MAT_SNACK_BAR_DATA

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

@Component({
  selector: 'your-snackbar',
  template: 'passed in {{ data }}',
})
export class MessageArchivedComponent {
  constructor(@Inject(MAT_SNACK_BAR_DATA) public data: string) { }
}

通过 snackBar.openFromComponent 方法打开自定义 snackbar 时,你可以使用以下指令来标记内容并确保其样式与通过 snackBar.open 打开的一致。

如果不使用标记,所有内容将被视为文本内容。

如果你要覆盖快餐栏的默认选项,可以使用 MAT_SNACK_BAR_DEFAULT_OPTIONS 令牌。

@NgModule({
  providers: [
    {provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: {duration: 2500}}
  ]
})

MatSnackBar 通过 aria-live 区域来播报消息。虽然默认情况下公告会使用 polite 设置,但你也可以通过设置 MatSnackBarConfigpoliteness 属性来自定义它。

MatSnackBar 不会将焦点移动到快餐栏元素。像这样移动焦点会在工作流程中扰乱用户。对于快餐栏中提供的任何操作,你的应用程序都应该提供执行该操作的替代方法。替代交互通常是键盘快捷键或菜单选项。一旦用户执行相应的操作,你应该关闭快餐栏。快餐栏可以包含一个单独的动作和一个额外的可选“关闭”或“取消”动作。

尽量不要为具有可用操作的快餐栏设置 duration ,因为屏幕阅读器用户可能希望导航到快餐栏上的元素以激活该操作。如果用户在快餐栏中手动移动了他们的焦点,你应该将焦点返回到用户工作流程上下文中有意义的某个地方。