ElementRef не определен в TemplateRef
Эксперименты с ElementRef, TemplateRef, ViewRef и ViewContainerRef в Angular. Я создал шаблон HTML, оттуда я хочу создать представление и передать это представление в ViewContainerRef, но это не работает
Код для шаблона
template: `
<ng-container #vc></ng-container>
<ng-template #mytmpl>
<div>Name: <input type="text" name="name" /> </div>
<div>Gender:
<select name="gender" >
<option>Male(1)</option>
<option>Female(2)</option>
</select>
</div>
<div>About you: <textarea ></textarea></div>
<div>Married: <input type="checkbox" /></div>
<div>Children:
<ng-container *ngFor = "let option of this.selectOptions">
<input type="radio" [id]="option" name="children" [value]=option [(ngModel)]="this.children"/> {{option}}
</ng-container>
</div>
<p>Some para</p>
<p>Para with span <span>Inside span</span></p>
</ng-template>
`
В классе я получаю доступ к шаблону и контейнеру представления
@ViewChild('vc',{read:ViewContainerRef}) v:ViewContainerRef;
@ViewChildren("mytmpl") myTemplateList:TemplateRef<any>;
Я использую следующий код для создания представления
ngAfterViewInit(){
let elementRef = this.myTemplateList.elementRef
let view = this.myTemplateList.createEmbeddedView(null)
this.v.insert(view)
console.log(elementRef);
}
Проблемы
1) elementRef не определен!- Я хочу печатать на консоли., все элементы внутри шаблона. но элементреф не определен!
2) я получаю ошибку, что createEmbeddedView не является функцией.
1 ответ:
Я получаю ошибку, что createEmbeddedView не является функцией.
Есть несколько проблем:
1) Используйте
{read: TemplateRef}
здесь:@ViewChildren("mytmpl", {read: TemplateRef}) myTemplateList:TemplateRef<any>;
2) Если вы используете
ViewChildren
, а неViewChild
, он возвращает коллекцию, поэтому вам нужно получить доступ к члену по индексу:myTemplateList.first
Так что получается:
@ViewChildren("mytmpl", {read: TemplateRef}) myTemplateList:TemplateRef<any>; ... let view = this.myTemplateList.first.createEmbeddedView(null)
Или просто использовать
ViewChild
:@ViewChild("mytmpl", {read: TemplateRef}) myTemplateList:TemplateRef<any>; ... let view = this.myTemplateList.createEmbeddedView(null)
1) elementRef не определен!- Я хочу напечатать на консоли все элементы внутри шаблона . но элементреф не определен!
Вы не можете получить прямой доступ к элементам из
templateRef
. Вы должны следовать тому же процессу, используя@ViewChildren
.elementRef
, который доступен наtemplateRef
, как показано здесь просто указывает на элемент DOM host, который Angular создал для элемента шаблона - это узел комментариев. Это не то, что вы думаете, не содержание шаблона. Чтобы получить его, просто используйте:this.myTemplateList.first.elementRef
Читать изучение методов угловой манипуляции DOM с использованием ViewContainerRef для получения более подробной информации.