angular 在创建组件后添加设置可投影节点的能力,

uqdfh47h  于 4个月前  发布在  Angular
关注(0)|答案(1)|浏览(90)

与功能请求相关的@angular/*包有哪些?

@angular/core

描述

目前,唯一添加可投影节点的方法是将其设置在createComponent变体之一(ViewContainerRef.createComponent, createComponent ...)中。
这种方法的问题在于,当动态创建多个嵌套组件时,无法正确获取注入层次结构(例如:https://stackblitz.com/edit/angular-xh1j19?file=src%2Fmain.ts)。
因此,无法动态重现以下场景:

<cmp1>
  <cmp2/>
</cmp1>

我们能做的最好的事情是:

const cmp2 = viewContainerRef.createComponent(Cmp2, /* { injector: NEED_INJECTOR_OF_CMP1_HERE } */ );
const cmp1 = viewContainerRef.createComponent(Cmp1, { projectableNodes: [[cmp2.location.nativeElement]]});

但如果CMP1具有组件提供程序,这将是一个问题。
要获得与声明式方法相同的注入层次结构,我们需要类似的东西:

const cmp1 = viewContainerRef.createComponent(Cmp1);
const cmp2 = viewContainerRef.createComponent(Cmp2, { injector: cmp1.injector } );
cmp1.setProjectableNodes([[cmp2.location.nativeElement]]);

所以缺少类似于ComponentRef.setProjectableNodes的方法。

建议的解决方案

ComponentRef 添加一个方法 setProjectableNodes;
这允许按照模板中的顺序创建组件,因此可以正确获取注入层次结构。

考虑过的替代方案

lnxxn5zx

lnxxn5zx1#

有趣的是,出于笔记的目的,我想引用我的问题,因为这个问题在动态渲染过程中非常有用:#51491

相关问题