Вы не можете получить элементы содержимого шаблона из TemplateRef
. Ссылка на шаблон - это просто ссылка на шаблон, а не на отображаемый шаблон. Он представлен как узел комментария в HTML DOM, как вы нашли, и не имеет никакого отношения к контенту.
Я думаю, для вашего случая решение состоит в том, чтобы определить другую директиву, которая применяется к элементам ввода внутри шаблоны. Таким образом, вы можете легко запрашивать также все элементы ввода, используя другой запрос @ContentChildren
.
Например, такая директива может выглядеть следующим образом:
@Directive({
selector: '[appVvsTemplateInput]'
})
export class VvsTemplateInputDirective {
@Input('appVvsTemplateInput') inputCell: VvsGridInputCellDirective;
constructor(public inputElementRef: ElementRef) {
}
}
Я добавил свойство inputCell
так что вы можете позже сопоставить ввод с правильной ячейкой. Вот пример шаблона столбца, использующего также эту директиву:
<ng-template appVvsGridInputCell #cell3="appVvsGridInputCell" let-data header="COMMENT">
<div class="regular-padding">
<input [appVvsTemplateInput]="cell3" type="text" [(ngModel)]="data.comment">
</div>
</ng-template>
Теперь в компонент сетки вы добавляете запрос @ContentChildren
для этой директивы, и вы получите все входные данные с этой директивой. Из них вы можете найти тот, который соответствует столбцу, который вы ищете.
Вот соответствующий код из компонента:
@ContentChildren(VvsTemplateInputDirective) private columnInputs: QueryList<VvsTemplateInputDirective>;
public getTemplateInputElement(): HTMLElement {
const foundColumn = this.columnInputs.toArray().find((templateInputDirective) => templateInputDirective.inputCell === this._visibleInputCols[1]);
return foundColumn.inputElementRef.nativeElement;
}
Есть другое решение, которое является более хакерским решением с моей точки зрения. Вы можете использовать запрос @ViewChildren
, чтобы получить все элементы, которые являются выходами шаблона. Это снова элементы комментариев. Из этих элементов комментария вы можете получить основной элемент содержимого шаблона, получив nextSibling
из nativeElement
. Angular присоединяет динамическое содержимое c в качестве родственного элемента контейнера. Я думаю, что немного опасно полагаться на это. Также вам нужно будет сделать более прямой обход DOM, чтобы найти элемент ввода.
Чтобы упростить запрос, полезно добавить имя к элементу с помощью директивы ngTemplateOutlet
.
<ng-container #templateOutlet
[ngTemplateOutlet]="col.templateRef"
[ngTemplateOutletContext]="{$implicit: inputRow}" >
</ng-container>
Затем вы можете выполнить запрос по имени в компоненте и получить элемент содержимого в виде nextSibling
.
@ViewChildren('templateOutlet') private templateOutlets: QueryList<ElementRef>;
public getTemplateContentElement(): HTMLElement {
return this.templateOutlets.toArray()[1].nativeElement.nextSibling;
}
. Здесь также есть ссылка на форк вашего StackBlitz * 1034. * где я добавил оба этих подхода.