You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular环境下如何判断Font Awesome图标是否存在?

问题描述

我做了一个功能:左侧输入框,右侧实时显示和输入值同名的Font Awesome图标。但遇到两个问题:

  • 不是所有输入的名称都有对应图标,比如输入随机文本skdfji,还有部分图标只存在于特定库(比如house在FaSolid里有,但FaLight里没有);
  • 输入过程中的中间字符也会触发无效匹配(比如输入house时,前四个字符h、o、u、s都不是有效图标)。

这些情况导致Font Awesome日志大量报错,我还想判断图标是否存在,给用户反馈。

我尝试写了判断图标的方法,但不管图标是否存在,都返回undefined:

import { findIconDefinition, IconName, IconPrefix, SizeProp } from '@fortawesome/fontawesome-svg-core';

public iconExists(name: IconName, library: IconPrefix): boolean {
  return !!findIconDefinition({ iconName: name, prefix: library });
}
...
otherMethod() {
  if(findIconDefinition('house', 'fal') {
    console.log('Found', 'house');
  } else {
    console.log('Not found', 'house');
  }
}

我的依赖版本:

"@fortawesome/angular-fontawesome": "^0.12.1",
"@fortawesome/fontawesome-svg-core": "^6.2.1",
"@fortawesome/pro-duotone-svg-icons": "^6.2.1",
"@fortawesome/pro-light-svg-icons": "^6.2.1",
"@fortawesome/pro-regular-svg-icons": "^6.2.1",
"@fortawesome/pro-solid-svg-icons": "^6.2.1",
解决方案

你之前的方法无效,核心原因是findIconDefinition只能查找已经注册到Font Awesome library中的图标,如果没有提前把对应库的图标添加进去,它必然返回undefined。

下面提供两种可行的解决方式:

方式一:提前注册目标图标库

在项目初始化阶段,把需要用到的图标库全部注册到library中,之后就能正常使用findIconDefinition进行判断:

import { library } from '@fortawesome/fontawesome-svg-core';
import * as faSolid from '@fortawesome/pro-solid-svg-icons';
import * as faLight from '@fortawesome/pro-light-svg-icons';
import * as faRegular from '@fortawesome/pro-regular-svg-icons';
import * as faDuotone from '@fortawesome/pro-duotone-svg-icons';

// 将所有图标库注册到Font Awesome
library.add(faSolid, faLight, faRegular, faDuotone);

// 现在可以正常判断图标是否存在
public iconExists(name: IconName, prefix: IconPrefix): boolean {
  return !!findIconDefinition({ iconName: name, prefix: prefix });
}

方式二:直接从图标包中检查(避免全量注册)

如果担心全量注册图标导致打包体积过大,可以直接访问对应图标包的icons对象,判断目标图标名称是否存在:

import * as faSolid from '@fortawesome/pro-solid-svg-icons';
import * as faLight from '@fortawesome/pro-light-svg-icons';
import * as faRegular from '@fortawesome/pro-regular-svg-icons';
import * as faDuotone from '@fortawesome/pro-duotone-svg-icons';
import { IconPrefix } from '@fortawesome/fontawesome-svg-core';

public iconExists(name: string, prefix: IconPrefix): boolean {
  // 建立前缀与对应图标库的映射
  const iconLibraryMap = {
    'fas': faSolid.icons,
    'fal': faLight.icons,
    'far': faRegular.icons,
    'fad': faDuotone.icons
  };

  const targetLibrary = iconLibraryMap[prefix];
  // 检查目标库是否存在,且库中包含该图标
  return targetLibrary ? !!targetLibrary[name] : false;
}

另外,针对输入过程中中间字符频繁触发无效判断的问题,建议给输入事件添加防抖处理(比如延迟500ms再执行图标检查),既能减少日志报错,也能提升性能。

内容的提问来源于stack exchange,提问作者Wouter Vandenputte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:15:47