不幸的是,这不能完全解决您的问题,因为您需要在mat-icon
元素上使用参数svgIcon
,而不是使用mat-icon
的innerText
,但其他方面它可以工作:
- 必须允许Angular通过声明模块来导入svg。
- 要将图标导入/内联到JavaScript中,您将需要覆盖加载器。这可以通过使用
raw-loader
来实现。
- 现在,您将能够将svg导入Angular并通过
MatIconRegistry
注册它们;
例如:
declare module '*.svg' {
const svg: string;
export default svg;
}
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_more
和chevron_right
所以在 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
库拥有的更多的图标。
希望这有所帮助。
@mdi/svg
如何呢? 然后像上面提到的那样导入Material图标。 那么它们至少可以一致地用作svgIcon's。并不完美,因为您需要注册每个要使用的材料图标... 如果您认为这可以解决问题,我会更新答案。 - Eydrian<mat-icon [svgIcon]="icon">{{ icon }}</mat-icon>
,如果没有可用的连字符,则会使用 svgIcon。 - Eydrian