如何在 Angular 5 的 Angular 材质 Snackbar 中添加图标

Posted

技术标签:

【中文标题】如何在 Angular 5 的 Angular 材质 Snackbar 中添加图标【英文标题】:How to add Icon inside the Angular material Snackbar in Angular 5 【发布时间】:2019-02-05 13:22:14 【问题描述】:

我是 Angular 新手,我正在为 UI 使用 Angular Material Design。

在我的应用程序中,我有一个小吃店。

现在我想在零食栏中设置一个图标,但我尝试了一些 *** 帖子,但无法设置。

代码:

this.snackBar.open('You are already registered.Please log in.','',  duration: 2000 );

我想将图标设置为如图所示,但下面的小吃栏没有图标。我不知道如何添加。

谁能帮我添加这个。

【问题讨论】:

这可以用 unicode 完成吗? 【参考方案1】:

尝试MatSnackBar 服务的openFromComponentopenFromTemplate 方法,而不是普通的open

【讨论】:

【参考方案2】:

MatSnackBar 的 open 方法只允许您打开带有文本的小吃店,即简单的小吃店。如果您想拥有一个更复杂的小吃店 - 例如添加了图标的小吃店 - 您必须创建一个独特的组件并使用 openFromComponent 方法打开该组件。

【讨论】:

【参考方案3】:

我就是这样做的

    创建组件 为snackBar 创建一个服务 将组件添加到模块中。在 declarationsentryComponents 中导入它 使用服务

例子

my-snackbar.component.ts

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

    @Component(
      selector: 'my-snackbar',
      templateUrl: './snackbar.component.html',
      styleUrls: ['./snackbar.component.scss']
    )
    export class MySnackbarComponent implements OnInit 
      constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) 
        console.log(data); 
      

      ngOnInit() 

      get getIcon() 
        switch (this.data.snackType) 
          case 'Success':
            return 'done';
          case 'Error':
            return 'error';
          case 'Warn':
            return 'warning';
          case 'Info':
            return 'info';
        
      
    

…………

my-snackbar.component.html

<div fxLayout="row" class="snack-container">
  <div>
    <mat-icon>getIcon</mat-icon>
  </div>
  <div>
    <span>data.message</span>
  </div>
</div>

…………

my-snack-bar.service.ts

import  Injectable  from '@angular/core';
import  MatSnackBar  from '@angular/material/snack-bar';
import  MySnackbarComponent  from '../components/snackbar/my-snackbar.component';

@Injectable(
  providedIn: 'root'
)
export class MySnackBarService 
  constructor(private snackBar: MatSnackBar) 
  public openSnackBar(message: string, action: string, snackType?: snackType) 
    const _snackType: snackType =
      snackType !== undefined ? snackType : 'Success';

    this.snackBar.openFromComponent(SnackbarComponent, 
      duration: 2000,
      horizontalPosition: 'end',
      verticalPosition: 'top',
      data:  message: message, snackType: _snackType 
    );
  

........

app.module.ts

@NgModule(
  declarations: [
    SnackbarComponent
  ],
  imports: [
...
  ],
  providers: [],
  bootstrap: [AppComponent],
  entryComponents: [
    SnackbarComponent
  ]
)
export class AppModule 

.......

other.component.ts

import  Component, OnInit  from '@angular/core';
import  MySnackBarService  from '../../services/my-snack-bar.service';

@Component(
...
)
export class SomeComponent implements OnInit 

  constructor(
    private snack: MySnackService
  ) 

  ngOnInit() 
  


  openSnack() 
    this.snack.openSnackBar('Testing snack', '', 'Success');
  

【讨论】:

这很棒。最终将其用于我一直在开发的应用程序。还喜欢所有选项如何嵌套在服务中。感谢您发布此内容。【参考方案4】:

Sivuyile TG Magutywa 中的一些额外代码使其完整:

在 Snackbar HTML 中:

<div class="snack-container box-getIcon.type">
  <div class="snack-container-message">
    <div>
      <i class="fas getIcon.icon"></i>
    </div>
    <div>
      <span>data.message</span>
    </div>
  </div>
  <div class="snack-container-icon">
    <i class="fas close" (click)="closeSnackbar()"></i>
  </div>
</div>

在 SnackBar TS 文件中:

export class SnackbarComponent implements OnInit 

  constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) 
    console.log(data);
  

  ngOnInit() 

  get getIcon() 
    switch (this.data.snackType) 
      case 'success':
        return type: this.data.snackType, icon: 'check';
      case 'error':
        return type: this.data.snackType, icon: 'faults';
      case 'warn':
        return type: this.data.snackType, icon: 'warning_outline';
      case 'info':
        return type: this.data.snackType, icon: 'info';
    
  

  closeSnackbar() 
    this.data.snackBar.dismiss();
  


在小吃店服务中:

export class SnackBarService 
  messageText: string [];
  constructor(
    public snackBar: MatSnackBar,
  ) 
  
public openSnackBar(message, type, duration?, verticalPosition?, horizontalPosition?) 
    const _snackType = type !== undefined ? type : 'success';
    this.snackBar.openFromComponent(SnackbarComponent, 
      duration: duration || 4000,
      horizontalPosition: horizontalPosition || 'end',
      verticalPosition: verticalPosition || 'top',
      data:  message: message, snackType: _snackType, snackBar: this.snackBar 
    );
  


在其他组件中的用法:

constructor(private snackBar: SnackBarService) 
testSanck() 
   this.snackBar.openSnackBar('User Not Found', 'error');

【讨论】:

【参考方案5】:

对于仍在寻找此答案的其他任何人,有一种更简单的方法可以做到这一点,而无需创建新组件或更改您的小吃店名称。

您可以像这样向材料小吃栏添加一个类:

this.snackBar.open(message, "Dismiss", 
    panelClass:'error-alert-snackbar'
);

然后在你的 CSS 中,添加你的类。你可以像这样添加一些颜色:

.error-alert-snackbar
    color: white!important;
    background-color:red !important;
   .mat-simple-snackbar-action 
       color:white !important;
   

接下来您可以使用“yourclass:after”为该类添加图标:

.error-alert-snackbar:after      
    font-family: "FontAwesome";
    content: "\f071";

上面的“内容”是您通常调用的字体真棒图标名称的 Unicode 版本。您总是可以在图标图片下方的图标的 Font Awesome 页面上找到它,如果显示如何调用它。在这种情况下,它的 fa-exclamation-triangle。你通常会这样称呼它

<i class="fa fa-exclamation-triangle" ></i>

但是由于您无权访问材料小吃栏 html,您可以将图标直接添加到您的 css 类中,如我所示,然后将该 css 类附加到打开时的小吃栏,如图所示

编辑:我不知道这是否是 Angular 5 之后创建的小吃店的新功能,或者它是否在提出这个问题时存在。

【讨论】:

以上是关于如何在 Angular 5 的 Angular 材质 Snackbar 中添加图标的主要内容,如果未能解决你的问题,请参考以下文章

Angular 5 如何下载远程图像

如何在模态窗口 [ANGULAR 5] 内创建路由?

如何在 Angular 5 中从 Typescript 调用 JavaScript 函数?

如何在对象数组中显示特定对象(Angular 5,TypeScript)

如何在 Angular 5 HttpInterceptor 中添加多个标头

过期后如何刷新 JWT 令牌(Angular 1.5 + Laravel 5.2)