用SVG图形替换mat-icon

Smi*_*thy 5 javascript angular-material angular

Angular新手在这里..有人可以指导我正确的方法,如何用定制的图标正确地替换现有的Material图标,更确切地说是SVG图形?像这样:

所以这:

<mat-icon class="mat-icon-rtl-mirror">
     {{nestedTreeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
</mat-icon>
Run Code Online (Sandbox Code Playgroud)

有了这个:

<mat-icon class="mat-icon-rtl-mirror">
     {{nestedTreeControl.isExpanded(node) ? 'INSERT_SVG_1_HERE' : 'INSERT_SVG_2_HERE'}}
</mat-icon>
Run Code Online (Sandbox Code Playgroud)

Eyd*_*ian 12

Unfotunatley 这并不能完全解决您的问题,因为您需要svgIconthe mat-iconelement 上使用参数而不是使用innerTextofmat-icon但否则它会起作用:

  1. 您必须通过声明模块来允许从 svg 导入角度。
  2. 要将图标导入/内联到 javascript 中,您必须覆盖加载程序。这可以通过使用raw-loader.
  3. 现在您将能够将 svg 导入 angular 并通过MatIconRegistry;

举个例子:

// src/typings.d.ts

declare module '*.svg' {
  const svg: string;
  export default svg;
}
Run Code Online (Sandbox Code Playgroud)
// src/app/app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { DomSanitizer } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { MatIconModule, MatIconRegistry } from '@angular/material';

import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';

import thumbsUp from '!!raw-loader!./thumbs-up.svg';

@NgModule({
  imports:      [ 
    BrowserModule, 
    FormsModule, 
    MatIconModule 
  ],
  declarations: [ AppComponent, HelloComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule {
  constructor(iconRegistry: MatIconRegistry, sanitizer: DomSanitizer) {
    iconRegistry.addSvgIconLiteral(
        'thumbsUp', sanitizer.bypassSecurityTrustHtml(thumbsUp));
  }
}
Run Code Online (Sandbox Code Playgroud)
// src/app/app.component.html
<mat-icon svgIcon="thumbsUp"></mat-icon>
Run Code Online (Sandbox Code Playgroud)
// src/app/thumbs-up.svg
<svg>...</svg>
Run Code Online (Sandbox Code Playgroud)

另一种方法是安装@mdi/svg

npm install @mdi/svg

然后按照上面的步骤,不同之处在于导入每个必要的图标,例如expand_morechevron_right

所以在 src/app/app.module.ts

// src/app/app.module.ts
...
import expandMore from '!!raw-loader!@mdi/svg/svg/chevron-down.svg';
import chevronRight from '!!raw-loader!@mdi/svg/svg/chevron-right.svg';
...
export class WeddingDayModule {
  constructor(
    private iconRegistry: MatIconRegistry,
    private sanitizer: DomSanitizer
  ) {
    iconRegistry
      .addSvgIconLiteral('chevron_right', sanitizer.bypassSecurityTrustHtml(chevronRight))
      .addSvgIconLiteral('expand_more', sanitizer.bypassSecurityTrustHtml(expandMore));
  }
 }

Run Code Online (Sandbox Code Playgroud)

而在 html 中只是为了简化......但你会明白......

// src/typings.d.ts

declare module '*.svg' {
  const svg: string;
  export default svg;
}
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是,你必须注册所有你想使用的图标......但至少你保持在同一个变化领域。您可以更改所有连字而不是使用连字svgIcon,您将获得更多的图标,而不仅仅是过时的material-design-icons库所拥有的图标。

我希望有帮助