【问题标题】:Angular component naming limitations - 'selector [your component name] is invalid'Angular 组件命名限制 - “选择器 [您的组件名称] 无效”
【发布时间】: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?谁能详细说明/确认这个组件命名约束?

【问题讨论】:

    标签: angular typescript visual-studio-code angular-cli angular6


    【解决方案1】:

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

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

    1. 仅字符 [a-zA-Z0-9] 和 ISO 10646 字符 U+00A0 及更高,加上连字符 (-) 和下划线 (_);
    2. 它们不能以数字、两个连字符或连字符后跟 一个数字
    3. 标识符还可以包含转义字符和任何 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.`);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2017-04-04
      • 2019-05-01
      • 2016-11-19
      • 2020-05-26
      • 1970-01-01
      相关资源
      最近更新 更多