【问题标题】:What are projectable nodes in angular2angular2中的可投影节点是什么
【发布时间】:2017-02-27 14:57:36
【问题描述】:

在阅读ViewContainerRefComponentFactory的文档时,例如我们有方法

ViewContainerRef#createComponent 接受 3 个参数:componentFactoryinjectorprojectableNodes

我尝试查找 projectableNodes 的含义以及它们在博客、教程和源代码中的使用方式,但找不到太多信息。

在查找diff for for ngComponentOutlet directive 时,我只能收集到 projectableNodes 中的字符串被“投影”或呈现到创建的组件视图(可能是 ng-content )。如果是这样,那会令人困惑,因为我们有 ViewContainerRef#createEmbeddedView 相同。

我想知道这些projectedNodes 是什么,并有一个它们的用法示例。

【问题讨论】:

  • 我猜这就是<ng-content> 上通常显示的内容 - 嵌入的元素 - 但我自己还没有尝试过。
  • 我也是这么想的,我试着在源代码中找到它们的用途,但是不知道,猜想必须尝试在代码中使用它

标签: angular typescript


【解决方案1】:

可投影节点是节点元素(即实现 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-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]]);

    }


}

输出:

Demo

projectable content A

projectable content B

projectable content C

另外需要注意的是,在我们为可投影节点传递的二维数组中,每个一维数组条目都具有属于一起的特定视图的根元素/将在一个单个ng-content

【讨论】:

  • 非常好,但似乎它确实编译了投影元素(及其子元素)。如何编译那些 ng-contents?
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2010-11-05
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
相关资源
最近更新 更多