繁体   English   中英

用SVG图形替换mat-icon

[英]Replace mat-icon with SVG graphic

Angular新手在这里......有人可以指引我正确的方式如何正确地用自定义的图标替换现有的材料图标,更准确地说是SVG图形? 像这样的东西:

所以这:

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

有了这个:

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

Unfotunatley这并没有完全解决你的问题,因为你需要the mat-icon元素上使用参数svgIcon而不是使用mat-iconinnerText ,否则它可以工作:

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

举个例子:

// src/typings.d.ts

declare module '*.svg' {
  const svg: string;
  export default svg;
}
// 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));
  }
}
// src/app/app.component.html
<mat-icon svgIcon="thumbsUp"></mat-icon>
// src/app/thumbs-up.svg
<svg>...</svg>

另一种方法是安装@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));
  }
 }

而在html中只是作为一种简化......但你会得到这个想法......

//src/app/app.component.html
...
<mat-icon [svgIcon]="expanded ? 'chevron_right' : 'expand_more'" (click)="expanded = !expanded"></mat-icon>
...

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

我希望有所帮助

如果它不是材质图标的一部分,为什么不将它用作普通图像。 只需像普通的图像标签一样使用它:

<img src="{{nestedTreeControl.isExpanded(node) ? 'path_to_svg_file_1.svg' : 'path_to_svg_file_2'}}">

您可以使用angular-svg-icon

angular-svg-icon是一个Angular 7服务和组件,它提供了一种内联SVG文件的方法,允许它们通过CSS和代码轻松设置样式。

该服务提供了一个图标注册表,用于加载和缓存由其url索引的SVG。 该组件负责显示SVG。 从注册表获取svg后,它将SVGElement和SVG克隆到组件的内部HTML。

有关更多信息,请访问: https//www.npmjs.com/package/angular-svg-icon

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM