求助: 当使用 Angular 的 MatIcon 时,有概率不显示 icon 或者只显示部分的.

21 天前
 CyouYamato
新手学 Angular 人麻了. 附上代码
AComponent ts:
this.iconsLoaded$.subscribe((data: boolean) => {
this.iconsLoaded = data;
this.cdr.detectChanges();
});

async registerIcons() {
for (const item of this.gridColumns) {
// 从 IndexedDB 中取出 svg
const svg: string | undefined = await getSvg(item);
if (!svg) {
const svgContent = await fetch(`icon/${item}.svg`).then((res) =>
res.text(),
);
await setSvg(item, svgContent); // 缓存到 IndexedDB
this.matIconRegistry.addSvgIconLiteral(
item,
this.sanitizer.bypassSecurityTrustHtml(svgContent),
);
} else {
this.matIconRegistry.addSvgIconLiteral(
item,
this.sanitizer.bypassSecurityTrustHtml(svg),
);
}
}
return true;
}

BComponent ts:
await this.AComponent.registerIcons();
this.AComponent.iconSubject.next(true);

A html:
<ng-container class="grid-container">
<mat-grid-list cols="2" rowHeight="3:1">
@if (iconsLoaded$ | async) {
@for (item of gridColumns; track item) {
<mat-grid-tile class="grid-item">
<div class="content-container">
<mat-icon [svgIcon]="item"></mat-icon>
<span>
{{ cityInfo[item] }}
</span>
</div>
</mat-grid-tile>
}
}
</mat-grid-list>
</ng-container>
681 次点击
所在节点    前端开发
5 条回复
chihiro2014
21 天前
为啥整这么复杂?直接放在前端静态目录就完了=。=,然后注册到 maticonregistry 统一管理。不至于为了一点性能来折磨自己
wunonglin
21 天前
mat icon 有 npm 包,直接装了用就行了,区区 icon 用 indexdb 那不整复杂了,不是有 cdn 么
wunonglin
21 天前
CyouYamato
21 天前
@chihiro2014 准备部署在自己的小破服务器上, 想着能省一点带宽是一点, svg 这东西正好不需要频繁更新.
chihiro2014
21 天前
@CyouYamato 上面说的对,用 CDN 也不走你的流量。。。真的别为难自己。。。而且这种代码也用不着写 await 和 rxjs

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1101082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX