typescript - Angular-komponentnamnbegränsningar - 'väljare [ditt komponentnamn] är ogiltigt'
I Angular 6 (6.0.7) försöker jag generera en komponent via CLI. Jag skriver ng g c t1-2-3-user och får felmeddelandet Selector (app-t1-2-3-user) är ogiltig.
Finns det något som är i grunden förbjudet i detta namn? Jag har redan skapat en överordnad modul som heter t1-myModule via ng g module t1-myModule och den skapades framgångsrikt. Inom den modulen försöker jag nu generera denna komponent.
Jag har försökt skapa ett annat namn som ng g c t1-testComponent och det fungerar bra - så CLI verkar inte vara trasig. Något med att namnge en komponent t1-2-3-user i min setup gillar inte Angular.
REDIGERA: efter ytterligare tester verkar det som att Angular inte gillar att det första tecknet efter ett bindestreck - är en siffra. Möjligen en liknande begränsning som för JavaScript-variabler. Jag antar att det beror på att det kompileras till JavaScript? Kan någon utveckla/bekräfta denna begränsning för komponentnamn?
Svar #1
Enligt W3C-standarder ska selektorn uppfylla följande uppsättning saker
I CSS kan identifierare (inklusive elementnamn, klasser och ID:n i selektorer) innehålla
- endast tecknen [a-zA-Z0-9] och ISO 10646-tecken U+00A0 och högre, plus bindestreck (-) och understreck (_)
- de kan inte börja med en siffra, två bindestreck eller ett bindestreck följt av en siffra
- Identifierare kan också innehålla undkomna tecken och vilket ISO 10646-tecken som helst som en numerisk kod (se nästa punkt). Till exempel kan identifieraren "B&W?" skrivas som "B\&W\?" eller "B\26 W\3F".
Så Angular följer W3C-konventionen för selektornamn. Jag förväntade mig att se något liknande inbyggt i koden någonstans. Efter att ha grävt i CLI-koden visar det sig att Angular använder regex (/^[a-zA-Z][.0-9a-zA-Z]*(:?-[a-zA-Z][.0-9a-zA-Z]*)*$/) för att validera selector-namn innan filer skapas.
Så när man kör kommandot ng generate component component-name anropar det @angular/schematics för component-kommandot och skickar komponentnamnsparametern till det. När kommandot körs med en uppsättning instruktioner utlöses nedanstående rad för att validera väljaren.
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.`);
}
}
