8

Tôi đang cố gắng tìm ra cách tôi có thể truy cập vào selector mà chúng tôi chuyển vào trang trí @Component.Truy cập `bộ chọn` từ trong một thành phần Angular 2

Ví dụ

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

Cuối cùng, tôi muốn sử dụng này để tạo ra một chỉ thị mà sẽ tự động thêm một thuộc tính data-tag-name="{this.component.selector}" vì vậy mà tôi có thể sử dụng các truy vấn Selenium đáng tin cậy tìm các yếu tố góc của tôi bằng cách chọn của họ.

Tôi không sử dụng thước đo góc

Trả lời

12

Sử dụng ElementRef:

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

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

Đây có lẽ là cách duy nhất để làm điều đó ngay bây giờ Cách cũ hơn (bây giờ bị hỏng) là tốt hơn vì nó không yêu cầu thêm tiêm và nó có thể truy cập được mà không yêu cầu một cá thể. để kết thúc kiểm tra để giảm thiểu trùng lặp. –

7

lỗi thời Xem https://stackoverflow.com/a/42579760/227299

Bạn cần phải nhận được các siêu dữ liệu liên quan đến thành phần của bạn:

Lưu ý quan trọng Chú thích được lột ra khi bạn chạy AOT compiler hiển thị giải pháp này không hợp lệ nếu bạn đang biên dịch trước các mẫu

@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

này sẽ hứa hẹn, như thế nào là 'Reflect.getMetadata' thể biết rằng đó là nghĩa vụ để tìm kiếm siêu dữ liệu cho' MyComponent' nếu chúng ta không nói cho nó bất cứ điều gì? Tôi hiện đang gặp lỗi khi tôi gọi 'Reflect.getMetadata (' chú thích '); 'Lỗi là' Reflect.getMetadata (' chú thích ') VM61 angular2.sfx.dev.js: 2652 Uncaught TypeError (…) getMetadata @ Reflect.getMetadata ('chú thích', điều này, 'chú thích') 'Có vẻ như nó cần thêm hai tham số –

+1

Cố định câu trả lời của bạn bằng cách chuyển' this.constructor' làm đối số thứ hai. –

+2

Vui lòng hội đủ điều kiện câu trả lời này với phiên bản Angular 2 mà nó áp dụng - kể từ ngày phát hành 2.3.0 này dường như đã lỗi thời – Neoheurist

Các vấn đề liên quan