ViewContainerRef в Angular
Для программной вставки компонента или шаблона можно использовать сервис ViewContainerRef. Разберем как с ним работать, но для понимания концепции начнем разбор с чистого JavaScript. Исходя из предложенной разметки, ваша задача - добавить новый параграф рядом с текущим.
<p class=”one”>Element one</p>
Используя jQuery это можно сделать одной строчкой кода:
$('<p>Element two</p>').insertAfter('.one');Если мы хотим вставить элемент в DOM, нужно знать куда именно. Не важно что используется: JS или Angular. Принцип всегда один и тот же. Используя ViewContainerRef вставку можно осуществить следующим образом:
ViewContainerRef и DI
@Component({
selector: 'vcr',
template: `
<template #tpl>
<h1>ViewContainerRef</h1>
</template>
`,
})
export class VcrComponent {
@ViewChild('tpl') tpl;
constructor(private _vcr: ViewContainerRef) {
}
ngAfterViewInit() {
this._vcr.createEmbeddedView(this.tpl);
}
}
@Component({
selector: 'my-app',
template: `
<vcr></vcr>
`,
})
export class App {
}Мы внедрили сервис в компонент. В этом случае контейнер будет ссылаться на ваш элемент-хост (vcr), и шаблон будет вставлен как соседний элемент к элементу vcr.
@Component({
selector: 'vcr',
template: `
<template #tpl>
<h1>ViewContainerRef</h1>
</template>
<div>Some element</div>
<div #container></div>
`,
})
export class VcrComponent {
@ViewChild('container', { read: ViewContainerRef }) _vcr;
@ViewChild('tpl') tpl;
ngAfterViewInit() {
this._vcr.createEmbeddedView(this.tpl);
}
}
@Component({
selector: 'my-app',
template: `
<div>
<vcr></vcr>
</div>
`,
})
export class App {
}
Можно использовать декоратор ViewChild, чтобы захватить любой элемент в нашем шаблоне и считать его как ViewContainerRef. В этом примере элементом контейнера является элемент div , и шаблон будет вставлен как соседний к этому div.
Можно посмотреть в консоли, из чего состоит ViewContainerRef:
Это вольный перевод оригинального материала