Kir*_*ndi 10 typescript angular
在阅读ViewContainerRef和ComponentFactory的文档时,例如我们有方法
ViewContainerRef#createComponent包含3个参数:componentFactory,injector和projectableNodes.
我已经尝试查找projectableNodes它们在博客,教程和源代码中使用的含义和方式,但找不到多少.
在查找用于ngComponentOutlet指令的diff时,我可以收集的是,projectableNodes中的字符串被"投影"或呈现在创建的组件视图上(如ng-content可能).如果是这样会让人感到困惑,因为我们有相同的ViewContainerRef#createEmbeddedView.
我想知道这些是什么,projectedNodes并举例说明它们的用法.
Kir*_*ndi 27
可投影节点是节点元素(即实现节点接口的元素),它们被"投影"或换句话说,被转换到ng-content我们在组件模板中的节点元素.
例如,我们可以通过以下方式创建节点元素:
var myNode = document.createElement('div');
var text = document.createTextNode('this is my text');
myNode.appendChild(text);
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用上面的节点,方法如下:
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 ] ])
}
Run Code Online (Sandbox Code Playgroud)
投影节点接受二维数组,因为我们可以进行多时隙转换,即不止一个ng-content.
以下是如何使用可投影节点的完整示例ViewContainerRef#createComponent.此示例动态创建一个包含transclsion/ng-content的组件:
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]]);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Demo
projectable content A
projectable content B
projectable content C
Run Code Online (Sandbox Code Playgroud)
需要注意的另一件事是,在我们为可投影节点传递的2d数组中,每个1d数组条目具有属于一起的特定视图的根元素/将在单个ng-content块中一起渲染
| 归档时间: |
|
| 查看次数: |
2999 次 |
| 最近记录: |