8

Próbuję dowiedzieć się, jak mogę uzyskać dostęp do selector, które przekazujemy do dekoratora @Component.Uzyskiwanie dostępu do `selector` z wewnątrz składnika Angular 2

Na przykład

@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 
    } 
} 

Docelowo chciałbym to wykorzystać, aby stworzyć dyrektywę, która automatycznie dodaje atrybut data-tag-name="{this.component.selector}" tak, że można używać zapytań selenu niezawodnie znaleźć moje kanciaste elementy według ich selektora.

nie używam kątomierz

Odpowiedz

12

Zastosowanie ElementRef:

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

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

To prawdopodobnie jest teraz jedyny sposób, aby to zrobić teraz.Stare (teraz zepsute) sposób był lepszy, ponieważ nie wymagało dodawania zastrzyku i byłby dostępny bez potrzeby instancji, której używam przy pisaniu zakończyć testy, aby zminimalizować duplikację. –

7

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

trzeba uzyskać metadane związane z części:

Ważna uwaga Adnotacje zdjęte się po uruchomieniu AOT compiler renderowanie tego rozwiązania jest nieważne, jeśli szablony są wstępnie kompilowane

@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

To wygląda obiecująco, jak jest 'Reflect.getMetadata' mógł wiedzieć, że to miało wyglądać metadanych dla' MyComponent' jeśli nie mówisz to wszystko? Obecnie dostaję błąd, gdy nazywam "Reflect.getMetadata (" adnotacje ");" Błąd to "Reflect.getMetadata (" adnotacje ") VM61 angular2.sfx.dev.js: 2652 Uncaught TypeError (...) getMetadata @ Reflect.getMetadata ('adnotacje', to, 'adnotacje') 'Wygląda na to, że potrzebuje dwóch dodatkowych parametrów –

+1

Naprawiono odpowiedź, przekazując' this.constructor' jako drugi argument. –

+2

Proszę zakwalifikować tę odpowiedź za pomocą wersji Angular 2, której dotyczy - od wersji 2.3.0 wydaje się być nieaktualna – Neoheurist

Powiązane problemy