这是我的工作示例(Angular 11,Angular Material 11.0.1)。
最重要的部分是在 app.module.ts 中包含 MatSnackBarModule。另外,不要忘记导入 BrowserAnimationsModule。
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@NgModule({
imports: [
MatSnackBarModule,
BrowserAnimationsModule
...
],
那么,我的服务是这样的
import { Injectable } from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';
@Injectable({
providedIn: 'root'
})
export class SnackbarService {
constructor(
private _snackBar: MatSnackBar) {
}
error(message: string) {
return this._snackBar.open(message, undefined, {panelClass: ['snackbar-error']});
}
success(message: string) {
return this._snackBar.open(message, undefined, {panelClass: ['snackbar-success']});
}
info(message: string) {
return this._snackBar.open(message, undefined, {panelClass: ['snackbar-info']});
}
}
为了定义样式,我将这些添加到 styles.scss
.mat-simple-snackbar {
font-size: 1.2em;
color: white;
}
.snackbar-error {
background-color: red;
}
.snackbar-success {
background-color: green;
}
.snackbar-info {
background-color: blue;
}
这样,我现在可以从代码中的任何位置(包括来自其他模块的组件)调用 SnackBar。使用示例:
import { Component } from '@angular/core';
import { AuthService } from 'src/app/services/auth/auth.service';
import { SnackbarService } from 'src/app/services/snackbar.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.scss']
})
export class LoginComponent {
loginForm: any;
constructor(private authService: AuthService, private snackbar: SnackbarService) { }
onSubmit() {
this.authService.login(this.loginForm).subscribe(res => {
this.snackbar.success('Logged in');
}, e => {
this.snackbar.error('Login failed');
});
}
}