2016-12-23 14 views
10

Cách tự động thêm ( inject ) một chỉ thị vào máy chủ?Cách tự động thêm chỉ thị?

Tôi có chỉ thị myTooltip và tôi muốn thêm chỉ thị mdTooltip vào máy chủ lưu trữ của nó. Tôi đã thử setAttribute() của ElementRef.nativeElement, nhưng nó không tạo chỉ thị mdTooltip.

mytooltip.directive.ts:

@Directive({ 
    selector: '[my-tooltip]', 
    host: { 
    '(mouseenter)': 'show()', 
    '(mouseleave)': 'hide()', 
    } 
}) 
export class myTooltip { 
    @Input('my-tooltip') message; 

    constructor() { } 

    show() { 
    /* TODO: How to add md-tooltip directive to elementref (host)? */ 
    } 

    hide() { 
    /* TODO: remove md-tooltip directive from elementref (host) */ 
    } 
} 

By chủ tôi có nghĩa là các phần tử có chỉ thị myTooltip:

<span my-tooltip="tooltip hint">Click here</span> 

Kết quả sẽ không thay đổi trên html nhưng trên mouseenter nó sẽ có chỉ thị md-tooltip trong span.

BTW, lý do tôi đang sử dụng trình bao bọc chứ không phải md-tooltip trực tiếp là sau này tôi muốn sửa đổi độ trễ hiển thị, trì hoãn và tùy chỉnh hành vi của công cụ vật liệu trong các phương tiện khác.

Sửa chỉ thị Rõ ràng thêm động hiện không được hỗ trợ :(Tôi nghĩ câu hỏi này vẫn nên ở đây trong trường hợp nó đội cập nhật tài liệu nào

+0

Các bạn đã thử 'constructor (tt tin: myTooltip) {con duy nhất.log (tt); } '? Không chắc chắn nếu điều này hoạt động. "Host" thực sự là gì? '' không giống như một thành phần. –

+0

Bạn đang nói về "tiêm" khi bạn yêu cầu một nhà cung cấp trong nhà xây dựng, nhưng trong trường hợp này tôi không có ý đó. Những gì tôi có nghĩa là bằng cách tiêm ở đây là có khả năng để chèn một chỉ thị vào một yếu tố dom đã được trả lại, một khoảng, trong trường hợp này. Bạn sẽ làm điều này trong html như thế này ' Bấm vào đây', nhưng bây giờ tôi đang tìm một cách lập trình để làm điều đó. – RichieRock

+0

Đó không phải là tên hoặc liên quan đến tiêm chích. Thêm chỉ thị động hiện không được hỗ trợ, chỉ các thành phần có thể được thêm động. –

Trả lời

9

Đó là một tính năng chúng tôi đang yêu cầu trong góc ... đọc này: https://github.com/angular/angular/issues/8785

Một cách nhanh chóng và dơ bẩn để làm điều đó là sử dụng:

Component.ts

@HostBinding('attr.myHilite') myHilite = new myHilite();

hoặc nếu bạn có các thông số ...

@HostBinding('attr.myHilite') myHilite = new myHilite(this.elementRef);

nếu chỉ thị của bạn cần để thực thi mã trong một trong những móc vòng đời, bạn cần phải tự gọi phương thức móc vòng đời của chỉ thị trong các phụ huynh phương pháp vòng đời móc thành phần như thế này ...

Component.ts

ngOnInit(){ 
    this.myHilite.ngOnInit(); 
} 
+1

Cảm ơn! Tôi nghĩ đây là câu trả lời hay nhất hiện nay. Tôi cũng nhận thấy rằng ai đó đã hỏi câu hỏi tương tự ở đây: http://stackoverflow.com/questions/37148080/use-angular2-directive-in-host-of-another-directive – RichieRock

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