8

@Component dekoratörüne geçirdiğimiz selector'a nasıl erişebileceğimi anlamaya çalışıyorum.Açısal 2 bileşeninin içinden "seçici" ye erişme

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

Sonuçta Örneğin

, ben otomatik yüzden güvenilir onların seçici tarafından benim açısal elemanları bulmak için Selenyum sorguları kullanabileceği bir öznitelik data-tag-name="{this.component.selector}" ekleyen bir yönergeyi oluşturmak için bu kullanmak istiyorum. Eğer AOT compiler çalıştırdığınızda dışarı şeritli

Önemli Not Açıklamalar:

Ben iletki

cevap

12

Kullanım ElementRef:

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

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

Bu muhtemelen şimdi bunu yapmanın tek yoludur.Daha eski (şimdi kırılmış) bir yol, bir enjeksiyon eklemeyi gerektirmediğinden ve bir yazıya ihtiyaç duymadan erişilebilir olacağından daha iyi olurdu. çoğaltmayı en aza indirmek için testleri sonlandırmak. –

7

ESKİ Sen meta verilerin bileşenle ilişkili almak gerekir https://stackoverflow.com/a/42579760/227299

Bkz kullanmıyorum Şablonu doldururken bu çözümü geçersiz kılar

@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

Bu umut verici görünüyor, bunun şey söylemiyorlar eğer 'o' MyComponent' meta aramak gerekiyordu olduğunu bilmek mümkün Reflect.getMetadata' nasıl? Reflect.getMetadata ('açıklama'); 'Hata 'Reflect.getMetadata (' açıklama ')' dir VM61 angular2.sfx.dev.js: 2652 Yakalanmamış TypeError (…) getMetadata @ Reflect.getMetadata ('ek açıklamalar', bu, 'ek açıklamalar') 'İki ek parametreye ihtiyacı var gibi görünüyor –

+1

İkinci argüman olarak' this.constructor'ı geçerek cevabınızı düzeltin. –

+2

Lütfen bu cevabı geçerli olduğu Angular 2 sürümü ile nitelendirin - sürüm 2.3.0'dan itibaren güncel değil gibi görünüyor – Neoheurist