8

Ich versuche herauszufinden, wie ich auf die selector zugreifen kann, die wir in den @Component Dekorateur übergeben.Zugriff auf "Selektor" aus einer Angular 2-Komponente

Zum Beispiel

@Component({ 
    selector: 'my-component' 
}) 
class MyComponent { 
    constructor() { 
    // I was hoping for something like the following but it doesn't exist 
    this.component.selector // my-component 
    } 
} 

Letztlich würde Ich mag diese verwenden, um eine Richtlinie zu erstellen, die ein Attribut fügt automatisch data-tag-name="{this.component.selector}" so dass ich Selenium Anfragen zuverlässig verwenden kann, um meine Winkelelemente durch ihre Wähler zu finden.

Ich bin nicht mit Winkelmesser

Antwort

12

Verwendung ElementRef:

import { Component, ElementRef } from '@angular/core' 

@Component({ 
    selector: 'my-component' 
}) 
export class MyComponent { 
    constructor(elem: ElementRef) { 
    const tagName = elem.nativeElement.tagName.toLowerCase(); 
    } 
} 
+0

Dies ist wahrscheinlich der einzige Weg, es jetzt zu tun. Der ältere (jetzt gebrochen) Weg war besser, da es keine Injektion hinzufügen musste und es zugänglich wäre, ohne eine Instanz zu benötigen, die ich beim Schreiben verwende um Tests zu beenden, um Doppelarbeit zu minimieren. –

7

OUTDATED Siehe https://stackoverflow.com/a/42579760/227299

Sie müssen die Metadaten im Zusammenhang mit Ihrer Komponente erhalten:

Wichtiger Hinweis Anmerkungen erhalten gestrippt, wenn Sie die AOT compiler laufen Diese Lösung wird ungültig, wenn Sie Vorlagen vorkompilieren

@Component({ 
    selector: 'my-component' 
}) 
class MyComponent { 
    constructor() { 
    // Access `MyComponent` without relying on its name 
    var annotations = Reflect.getMetadata('annotations', this.constructor); 
    var componentMetadata = annotations.find(annotation => { 
     return (annotation instanceof ComponentMetadata); 
    }); 
    var selector = componentMetadata.selector // my-component 
    } 
} 
+0

Das sieht vielversprechend aus, wie 'ist Reflect.getMetadata' der Lage zu wissen, dass es für Metadaten für' MyComponent' aussehen soll ist, wenn wir es nicht etwas zu sagen? Ich erhalte derzeit einen Fehler, wenn ich 'Reflect.getMetadata ('Annotationen') anrufe;' Der Fehler ist 'Reflect.getMetadata ('Annotationen') VM61 angular2.sfx.dev.js: 2652 Uncaught TypeError (...) getMetadata @ Reflect.getMetadata ('Annotations', this, 'Annotations') 'Es sieht aus wie es zwei zusätzliche Parameter benötigt –

+1

Ihre Antwort behoben, indem' this.constructor' als zweites Argument übergeben. –

+2

Bitte qualifizieren Sie diese Antwort mit der Version von Angular 2, für die sie gilt - ab Version 2.3.0 scheint dies nicht mehr aktuell zu sein – Neoheurist