angular templateRef nativeElement - пустой комментарий вместо исходного элемента
Я разрабатываю угловую директиву, которая преобразует выпадающий список в radioListbox. вот мой начальный код:
import { Directive, Input, TemplateRef, ViewContainerRef,OnInit } from '@angular/core';
@Directive({
selector: '[radioList]'
})
export class RadioListDirective implements OnInit {
constructor(private templateRef: TemplateRef<any>, private vcRef: ViewContainerRef) {
}
ngOnInit() {
console.log(this.templateRef);
this.vcRef.createEmbeddedView(this.templateRef);
}
}
а также
<div>
test
</div>
<select *radioList><option>1</option><option>2</option></select>
Это должно войти TemplateRef
чья ElementRef
родной элемент является select
, Но результат и пустой комментарий, что его следующим элементом является select
,
2 ответа
В настоящее время работают хакерские решения:
Хватай следующего брата:
this.templateRef.elementRef.nativeElement.nextSibling
Используйте viewContainerRef.get
(this.viewContainerRef.get(0) as any).rootNodes[0]
(Обратите внимание, из вашего примера кода вы использовали vcRef
вместо viewContainerRef
как я использовал здесь.)
Найдите ответ в пустом нативном элементе с помощью ng-template
ElementRef не имеет ничего общего сradioList
, и это должен быть элемент комментария:
<!---->
Это сохраненная функция, которая, если вы привязываете параметр директивы в качестве входных данных, так что
<select *radioList="true"><option>1</option><option>2</option></select>
Тогда директива может иметь:
@Input('radioList') isEnabled: boolean;
И визуализированные ElementRefnativeElement
становится:
<!--bindings={
"ng-reflect-is-enabled": "true"
}-->
Итак, в заключение, это ожидаемо.
Чтобы продолжить код,createEmbeddedView
создает контейнер для всего, что должно быть реализованоvcRef
, поэтому вы можете внедрить cfResolver: ComponentFactoryResolver для разрешения, например, другого компонента шаблона:
const cmpFactory = this.cfResolver.resolveComponentFactory(SomeOtherComponent);
this.vcRef.createComponent(cmpFactory);