当显示来自使用MatSnackBar
的服务消息服务的消息时,我想显示一个图标。 (“材料”模块已导入到应用程序的模块中)。
但是,默认的小吃店不支持图标。如何实现这种功能?
import { Injectable } from '@angular/core'
import {MatSnackBar} from '@angular/material/snack-bar';
import {MatSnackBarHorizontalPosition, MatSnackBarVerticalPosition} from "@angular/material";
@Injectable()
export class MessagesService {
horizontalPosition: MatSnackBarHorizontalPosition = 'right';
verticalPosition: MatSnackBarVerticalPosition = 'top';
constructor(private snackBar: MatSnackBar) {
}
info(message: string) {
const icon = `<mat-icon>info</mat-icon>`;
const msg = `${icon} ${message}`;
this.snackBar.open(msg, 'X', {
duration: 2000,
horizontalPosition: this.horizontalPosition,
verticalPosition: this.verticalPosition,
panelClass: ['info-message']
});
}
}
答案 0 :(得分:2)
您必须使用自定义小吃栏组件才能显示图标。幸运的是,这应该与定义对话框以显示内容的方式类似,只是它是小吃店而不是对话框。
可以将数据传递到小吃店,就像将数据传递到对话框一样。
请注意,在声明快餐栏时,还必须将其导入entryComponents
声明的NgModule
属性中。
这是一个例子:
icon-snack-bar.component.ts
import { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';
// ...
@Component({
selector: '...',
template: `<mat-icon>{{ data?.icon }}</mat-icon> <span>{{ data?.message }}</span>`
// Most likely you have to add styles in order to position the icon, although I haven't tested it yet
export class IconSnackBarComponent {
constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) { }
}
my-component.component.ts
import { IconSnackBarComponent } from './icon-snack-bar/icon-snack-bar.component';
import { MatSnackBar } from '@angular/material/snack-bar';
// ...
export class MyComponent {
constructor(private snackBar: MatSnackBar) { }
openCustomSnackBar() {
this.snackBar.openFromComponent(IconSnackBarComponent, {
data: {
message: 'Hello, snackbar!',
icon: 'info'
}
});
}
}
app.module.ts
import { NgModule } from '@angular/core';
import { IconSnackBarComponent } from './icon-snack-bar/icon-snack-bar.component';
// ...
@NgModule({
declarations: [
// ...
IconSnackBarComponent
],
entryComponents: [
IconSnackBarComponent
]
})
export class AppModule { }
文档here中也对此进行了部分覆盖。
答案 1 :(得分:0)
添加到Edric的答案中。
如果使用弹性布局,则不需要其他样式即可对齐快餐栏内容。只需使用适当的layoutAlign值将内容包装在div中即可。