Структурная директива - поиск элемента, на который он помещен
Со структурной директивой, как бы я мог удержать элемент (native), на который включена директива? С обычной директивой ElementRef имеет свой nativeElement, указывающий на него - например:
<input type="text" example>
@Directive({
selector: '[example]'
})
export class ExampleDirective {
constructor( private el: ElementRef) {}
ngAfterViewInit() {
console.log(this.el.nativeElement); // the input
}
}
Но со структурной директивой он указывает на комментарий к шаблону - например.
<input type="text" *example>
@Directive({
selector: '[example]'
})
export class ExampleDirective {
constructor(
private el: ElementRef,
private view: ViewContainerRef,
private template: TemplateRef<any>
) {}
ngAfterViewInit() {
this.view.createEmbeddedView(this.template);
console.log(this.el.nativeElement); // template bindings comment
// how to find the input itself?
}
}
Я пробовал использовать различные комбинации ViewContainerRef, TemplateRef, @ContentChild, @ViewChild - просто кажется, что не может найти сам элемент ввода...
Ответы
Ответ 1
Все структурные директивы добавляются в элементы <template>
. Угловой никогда не добавляет элементы <template>
в DOM. Поэтому невозможно получить элемент, к которому добавлена структурная директива.
Если вы используете сокращенный синтаксис с *
like
<div *ngIf="..."></div>
угловое создает
<template [ngIf]="...">
<div></div>
</template>
и поскольку <template>
не добавляется, нет способа получить его, и поскольку <div>
не является элементом, добавленным к вам, также не может получить этот элемент с помощью ссылки на директиву.
Ответ 2
Это не очень, но работал на меня:
this.viewContainer.get(0).rootNodes[0]
Я использовал его при реализации версии директивы *ngIf
но с анимацией: animatedIf.
Ответ 3
Когда структурная директива используется в HTMLElement
, вы не получите ссылку на этот элемент, поскольку она пока не отображается. input text box
пока не отображается, когда вы пытаетесь получить к нему доступ в вашем коде console.log(this.el.nativeElement);//template bindings comment
console.log(this.el.nativeElement);//template bindings comment
Пожалуйста, перейдите по ссылке ниже, чтобы узнать, как структурные директивы в Угловой работе. https://angular.io/guide/structural-directives#the-asterisk--prefix
Таким образом, чтобы получить ссылку на элемент, вы можете использовать attribute directive
на одном элементе и делать необходимые вещи.
Ответ 4
Основываясь на документации по структурным директивам (не уверен, что она работает, но, может быть, поможет вам):
<input type="text" *example>
@Directive({
selector: '[example]'
})
export class ExampleDirective {
constructor(private viewContainer: ViewContainerRef) { }
@Input() set example() {
console.log(this.viewContainer.element.nativeElement.value);
}
}