Angular 组件命名限制 - “选择器 [您的组件名称] 无效”

Posted

技术标签:

【中文标题】Angular 组件命名限制 - “选择器 [您的组件名称] 无效”【英文标题】:Angular component naming limitations - 'selector [your component name] is invalid' 【发布时间】:2019-04-13 08:51:47 【问题描述】:

Angular 6 (6.0.7) 中,我试图通过 CLI 生成一个组件。我输入ng g c t1-2-3-user 并收到错误消息Selector (app-t1-2-3-user) is invalid.

此名称中是否存在本质上不允许的内容?我已经通过ng g module t1-myModule 创建了一个名为t1-myModule 的父模块,并且创建成功。在该模块内是我试图生成这个组件的地方。

我尝试创建一个不同的名称,例如 ng g c t1-testComponent,它工作正常 - 所以 CLI 似乎没有损坏。 Angular 不喜欢在我的设置中命名组件 t1-2-3-user

编辑: 经过进一步测试,Angular 似乎不喜欢破折号 - 之后的第一个字符是数字。可能与 JavaScript 变量中的限制类似。我假设因为它被编译成 JavaScript?谁能详细说明/确认这个组件命名约束?

【问题讨论】:

【参考方案1】:

根据W3C standards 选择器应符合以下条件

在 CSS 中,标识符(包括元素名称、类和 ID) 选择器)可以包含

    仅字符 [a-zA-Z0-9] 和 ISO 10646 字符 U+00A0 及更高,加上连字符 (-) 和下划线 (_); 它们不能以数字、两个连字符或连字符后跟 一个数字 标识符还可以包含转义字符和任何 ISO 10646 字符作为数字代码(参见下一项)。例如,标识符“B&W?”可以写成“B\&W\?”或“B\26 W\3F”。

所以 Angular 遵循 W3C 的选择器名称约定。我预计会在某处的内部代码中看到类似的东西。深入CLI代码后发现,Angular在创建文件之前使用正则表达式(/^[a-zA-Z][.0-9a-zA-Z]*(:?-[a-zA-Z][.0-9a-zA-Z]*)*$/)来验证selector名称。

因此,在运行ng generate component component-name 命令时,它会为component 命令调用@angular/schematics,并将组件名称参数传递给它。在使用一组指令执行命令时,它会触发 below line 以验证选择器。

validatehtmlSelector(options.selector);

validation.ts

export const htmlSelectorRe = /^[a-zA-Z][.0-9a-zA-Z]*(:?-[a-zA-Z][.0-9a-zA-Z]*)*$/;
export function validateHtmlSelector(selector: string): void 
  if (selector && !htmlSelectorRe.test(selector)) 
    throw new SchematicsException(tags.oneLine`Selector ($selector)
        is invalid.`);
  

【讨论】:

以上是关于Angular 组件命名限制 - “选择器 [您的组件名称] 无效”的主要内容,如果未能解决你的问题,请参考以下文章

在Angular 12中更改组件的名称[重复]

Angular2找不到命名空间'google'

使用 Angular 1.5 组件的嵌套路由中的相对视图

Angular 2自定义弹出组件toast(使用路由)

Angular 4 中的可配置组件(动态类加载器)

前端组件用 Scope 发布 npm 包的方法