angular - 我如何在 angular 6 中使用 mdi 图标

标签 angular icons angular6

我正在尝试配置 mdi带有 @angular/material 的图标在我的小项目中。我已经尝试了几个教程,但都无济于事。

按照教程注册图标集时(如下图),出现一些错误...

constructor(matIconRegistry: MatIconRegistry, domSanitizer: DomSanitizer) { 
  matIconRegistry.addSvgIconSet(domSanitizer.bypassSecurityTrustResourceUrl('./assets/mdi.svg'));
}

这是我的代码...

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { MatIconRegistry, MatToolbarModule, MatIconModule } from '@angular/material';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
declarations: [
  AppComponent
],
imports: [
  BrowserModule,
  AppRoutingModule,
  FormsModule,
  HttpModule,
  MatToolbarModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

样式.scss

@import "~@angular/material/prebuilt-themes/indigo-pink.css";
@import url(https://fonts.googleapis.com/icon?family=Roboto);

$BasicColor: #76b3c8;
body {
  #basic {
    background-color: $BasicColor;
  }
}

index.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>PruebaAngular</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
</body>
</html>

app.component.html

<mat-toolbar id="basic">
  <span>Home</span>
</mat-toolbar>

<router-outlet></router-outlet>

angular.json
...
"architect": {
  "build": {
    "builder": "@angular-devkit/build-angular:browser",
    "options": {
      ...
      "assets": [
        "src/favicon.ico",
        "src/assets",
        { "glob": "**/*", "input": "./assets/", "output": "./assets/" },
        { "glob": "favicon.ico", "input": "./", "output": "./" },
        { "glob": "mdi.svg", "input": "../node_modules/@mdi/angular-material", "output": "./assets" }
      ],
    }
  },
}
...

最佳答案

Working example https://stackblitz.com/edit/angular-material-mdi



📦 安装 NPM 包

使用以下命令为@mdi/angular-material 安装 npm 包
npm install @mdi/angular-material --save

📁 包括 mdi.svg到编译 Assets 列表

添加 node_modules/@mdi/angular-material/mdi.svgassets的列表在您的 angular.json文件使用 glob句法
"assets": [
  "src/favicon.ico",
  "src/assets",
  { "glob": "mdi.svg", "input": "node_modules/@mdi/angular-material/", "output": "./assets" }
],

验证 mdi.svg正确复制到 assets文件夹

验证是否 mdi.svg文件被正确复制到 assets文件夹运行 ng build并查看生成的 dist/assets文件夹查看是否mdi.svg存在。如果没有,您可能需要调整 glob输入路径,因为它相对于工作区根。见 project assets documentation有关如何通过 angular.json 包含 Assets 的详细信息文件。

🎯注册SVG图标设置为@angular/material icon registry

使用 matIconRegistry 注册 svg 图标集在您的 AppModule 的构造函数中

import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule } from '@angular/core';
import { MatIconRegistry, MatIconModule } from '@angular/material';
import { DomSanitizer } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    HttpClientModule,
    MatIconModule, // you have to import MatIconModule into your app
  ]
})
export class AppModule {
  constructor(matIconRegistry: MatIconRegistry, domSanitizer: DomSanitizer){
    matIconRegistry.addSvgIconSet(domSanitizer.bypassSecurityTrustResourceUrl('./assets/mdi.svg'));
  }
}

🔧 用法

您将可以使用 mat-icon使用 svgIcon 指定所需图标的组件属性(property)

<!-- Icon by itself -->
<mat-icon svgIcon="android"></mat-icon>

<!-- Icon button -->
<button mat-icon-button>
  <mat-icon svgIcon="android"></mat-icon>
</button>

<!-- You can also combine an icon and text together -->
<button mat-button>
  <mat-icon svgIcon="code-tags"></mat-icon>
  <span>View source</span>
</button>

💡 对 @angular/material 的 CSS 调整

Note: As of 9 Jan 2020, you no longer have to specify the manual CSS adjustments shown below.



此外,他们说要将其添加到您的全局 CSS 文件 styles.css用@angular/material 解决一些对齐问题

button.mat-menu-item {
  line-height: 24px !important;
}

a.mat-menu-item > mat-icon {
  margin-bottom: 14px;
}

.mat-icon svg {
  height: 24px;
  width: 24px;
}

❓ 仍然有错误

作为一个线索,如果您在运行时仍然有错误,因为应用程序无法获取 mdi.svg文件,尽管它存在于 dist/assets 中使用时的文件夹 ng build这可能意味着某些东西正在阻止/拦截 HTTP 请求。

内存中的 Angular API

例如,当使用 angular-in-memory-api 时您需要设置属性 passThruUnknownUrl: true导入时HttpClientInMemoryWebApiModule (请参阅 releated issue )因为这允许图标集的 URL 传递而不会被拦截。

服务端渲染

对于 SSR,您可能必须在注册图标集时指定完整 URL(请参阅 related issue )才能 mdi.svg要正确获取文件。

📘 官方@mdi 文档

可以引用@mdi官方documentation如果有什么。

关于angular - 我如何在 angular 6 中使用 mdi 图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308811/

相关文章:

angular - 通过navigateByUrl 传递值,且navigationExtras 为空

javascript - 在 Angular 4+ 中插入数据的最佳方式

image - 将图像或图标添加到 primefaces 选项卡标题

datepicker - Angular 6的阿拉伯语/Hijri DatePicker

angular - TypeError : rxjs__WEBPACK_IMPORTED_MODULE_2__. Observable.throw 不是函数

angular - 动态从 FormArray 新添加的控件更改未传播

rest - 我如何在 Angular 2 中发布 JSON?

svn - Tortiose SVN - 缺少设置 - 使用 "_svn"而不是 ".svn"

android dev - 更改ic_launcher但在运行时不出现

javascript - 如何将字符串转换为 typescript 中的对象