Angular 组件命名限制 - 'selector [your component name] is invalid'

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

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?谁能详细说明/确认此组件命名限制?

最佳答案

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

In CSS, identifiers (including element names, classes, and IDs in selectors) can contain

  1. only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_);
  2. they cannot start with a digit, two hyphens, or a hyphen followed by a digit
  3. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".

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

因此,在运行 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 组件命名限制 - 'selector [your component name] is invalid',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231588/

相关文章:

Java Dependency Viewer 未出现在 Visual Studio Code 的资源管理器窗口中。任何强制切换 View 的命令?

javascript - Angular2 如何管理依赖注入(inject)?

javascript - 如何使图标与 Angular 5/6 中的按钮类似?

class - 在 TypeScript 中如何强制继承的类实现一个方法

Angular Http 客户端文件下载 - 来自响应的文件名

visual-studio-code - 如何在 VS Code 上禁用所有 "what' s new”屏幕?

node.js - 带有 WSL 的 VSCode - 如何使用 Bash 进行启动配置?

javascript - 调用(this.dragger)不起作用,d3.drag()

javascript - 从嵌入的 Plunker/StackBlitz 等代码编辑器发送和获取数据

android - 为什么我的下载链接在 Android WebView 中不起作用?