可投影節點是節點元素(即實現node interface的元素),它們被「投射」或換句話說,包含在我們組件模板中的ng-content
中。
例如,我們可以建立一個節點元件通過以下方式:
var myNode = document.createElement('div');
var text = document.createTextNode('this is my text');
myNode.appendChild(text);
然後,我們可以使用上述節點,通過以下方式:
constructor(private vcr:ViewContainerRef) {
}
ngAfterViewInit() {
let cmpFactory = this.vcr.resolveComponentFactory(MyDynamicComponent);
let injector = this.vcr.parentInjector;
var myNode = document.createElement('div');
var text = document.createTextNode('this is my text');
myNode.appendChild(text);
this.vcr.createComponent(cmpFactory,0,injector,[ [ myNode ] ])
}
的二維陣列被接受用於投影節點,因爲我們可以有多插槽的跨越,即不止一個ng-content
。
下面是如何使用ViewContainerRef#createComponent
的可投影節點的完整示例。此示例動態創建具有在它transclsion/NG-含量的組分:
import { Component, ViewContainerRef, ComponentFactoryResolver } from '@angular/core';
import { ComponentFactory,ComponentRef, Renderer } from '@angular/core';
@Component({
selector: 'sample',
template: '<ng-content></ng-content><ng-content></ng-content>'
})
export class Sample { }
@Component({
selector: 'demo',
template: '<p>Demo</p>',
entryComponents: [Sample]
})
export class DemoComponent {
constructor(private vcr: ViewContainerRef, private cfr: ComponentFactoryResolver, private r: Renderer) { }
ngAfterViewInit() {
let cmpFactory = this.cfr.resolveComponentFactory(Sample);
let injector = this.vcr.parentInjector;
let demoCompEl = this.vcr.element.nativeElement;
let projectedElA = this.r.createElement(demoCompEl,'p');
this.r.createText(projectedElA,'projectable content A');
this.r.detachView([projectedElA]);
let projectedElB = this.r.createElement(demoCompEl,'p');
this.r.createText(projectedElB,'projectable content B');
this.r.detachView([projectedElB]);
let projectedC = document.createElement('div');
let text = document.createTextNode('projectable content C');
projectedC.appendChild(text);
let cmpRef = this.vcr.createComponent(cmpFactory,0,injector,[[projectedElA],[projectedElB,projectedC]]);
}
}
輸出:
Demo
projectable content A
projectable content B
projectable content C
的產生額外的一點需要注意的是,二維陣列中,我們通過對可投影節點,每個1d數組條目具有特定視圖的根元素,屬於一起/將一起呈現在一塊ng-content
塊中
我猜這是通常在''處顯示的東西 - transcluded元素 - 但我還沒有嘗試過。 –
我在想同樣的事情,我試着在源代碼中找到它們的用途,但是coudnt,猜測不得不嘗試在代碼中使用它 –