Angular: ViewContainer 不是插入与锚元素相邻的组件,而是嵌套在组件本身内
Angular: ViewContainer isn't inserting component adjacent to anchor element, but nesting within the component itself
我创建了一个标签视图,结构如下:
<tabs>
<ul #getVCRefHERE >
<li>tab1</li>
<li>tab2</li>
</ul>
<tab>
<ng-content></ng-content> <!--screen for tab2 -->
</tab>
<tab>
<ng-content></ng-content> <!--content for tab1 -->
</tab>
</tabs>
我创建了每个组件:选项卡、选项卡和放置在 ng-content 中的组件。地方。问题是当我在 ViewContainer 的末尾插入时(它使用 ul 作为锚元素),顺序选项卡嵌套在选项卡内部,如下所示:
<tabs>
<ul #postionVCRef>
<li>tab1</li>
<li>tab2</li>
</ul>
<tab>
<ng-content></ng-content> <!--screen for tab1 -->
<tab>
<ng-content></ng-content> <!--content for tab2 -->
</tab>
</tab>
</tabs>
这是花哨的技巧,但没有帮助。当我在位置 0 插入时,不会发生这种奇怪的嵌套,但选项卡的插入顺序与创建时的顺序相反,这导致我稍后在我的应用程序中出现问题。
创建带有可投影节点的选项卡的代码如下所示:
// Tab == SubContainer, Tabs == Container
makeComp(component: Type<DynamicComponent>){
let compFactory =this.compFR.resolveComponentFactory(component);
let compRef = this.viewContainer.createComponent(compFactory);
let length =this.viewContainer.length - 1;
console.log(length)
let subFactory = this.compFR.resolveComponentFactory(SubContainer);
let subRef = this.viewContainer.createComponent(subFactory,length,undefined,[[compRef.location.nativeElement]]);
subRef.instance.title = compRef.instance.name;
this.subList.push(subRef.instance);
}
我觉得问题可能在于我如何创建 ng-content(可投影节点)。不幸的是,我不知道为什么 viewContainer 似乎使用选项卡的 ng-content 作为锚元素来插入下一个选项卡。
非常感谢对 viewContainer 有更好理解的人告诉我为什么会发生这种情况。这是我的示例 app,演示了这种嵌套行为。
使用此代码在应用组件选择器的位置插入元素的同级元素。
在您的组件中:
import { HostListener,ComponentRef,EventEmitter,OnInit,ElementRef, Injectable ,Component,Input,Output,ViewContainerRef,ViewChild } from '@angular/core';
在构造函数处
constructor(private _vcr: ViewContainerRef,private _eref: ElementRef) {
}
在class
@ViewChild('Date') Date;
ngAfterViewInit() {
this._vcr.createEmbeddedView(this.Date);
}
在模板
<ng-template #Date>
// Your Html
</ng-template>
使用 child 选择器的自然行为是将 child 模板 html 的代码插入 parent 组件中使用的选择器标签内。所以我们必须使用 ViewContainerRef [ Parent HTML Element] 的 createEmbeddedView 函数。如果你想在 parent 到 child 的选择器标签中提供一些 html 然后使用内部 child 模板。
我创建了一个标签视图,结构如下:
<tabs>
<ul #getVCRefHERE >
<li>tab1</li>
<li>tab2</li>
</ul>
<tab>
<ng-content></ng-content> <!--screen for tab2 -->
</tab>
<tab>
<ng-content></ng-content> <!--content for tab1 -->
</tab>
</tabs>
我创建了每个组件:选项卡、选项卡和放置在 ng-content 中的组件。地方。问题是当我在 ViewContainer 的末尾插入时(它使用 ul 作为锚元素),顺序选项卡嵌套在选项卡内部,如下所示:
<tabs>
<ul #postionVCRef>
<li>tab1</li>
<li>tab2</li>
</ul>
<tab>
<ng-content></ng-content> <!--screen for tab1 -->
<tab>
<ng-content></ng-content> <!--content for tab2 -->
</tab>
</tab>
</tabs>
这是花哨的技巧,但没有帮助。当我在位置 0 插入时,不会发生这种奇怪的嵌套,但选项卡的插入顺序与创建时的顺序相反,这导致我稍后在我的应用程序中出现问题。
创建带有可投影节点的选项卡的代码如下所示:
// Tab == SubContainer, Tabs == Container
makeComp(component: Type<DynamicComponent>){
let compFactory =this.compFR.resolveComponentFactory(component);
let compRef = this.viewContainer.createComponent(compFactory);
let length =this.viewContainer.length - 1;
console.log(length)
let subFactory = this.compFR.resolveComponentFactory(SubContainer);
let subRef = this.viewContainer.createComponent(subFactory,length,undefined,[[compRef.location.nativeElement]]);
subRef.instance.title = compRef.instance.name;
this.subList.push(subRef.instance);
}
我觉得问题可能在于我如何创建 ng-content(可投影节点)。不幸的是,我不知道为什么 viewContainer 似乎使用选项卡的 ng-content 作为锚元素来插入下一个选项卡。
非常感谢对 viewContainer 有更好理解的人告诉我为什么会发生这种情况。这是我的示例 app,演示了这种嵌套行为。
使用此代码在应用组件选择器的位置插入元素的同级元素。 在您的组件中:
import { HostListener,ComponentRef,EventEmitter,OnInit,ElementRef, Injectable ,Component,Input,Output,ViewContainerRef,ViewChild } from '@angular/core';
在构造函数处
constructor(private _vcr: ViewContainerRef,private _eref: ElementRef) {
}
在class
@ViewChild('Date') Date;
ngAfterViewInit() {
this._vcr.createEmbeddedView(this.Date);
}
在模板
<ng-template #Date>
// Your Html
</ng-template>
使用 child 选择器的自然行为是将 child 模板 html 的代码插入 parent 组件中使用的选择器标签内。所以我们必须使用 ViewContainerRef [ Parent HTML Element] 的 createEmbeddedView 函数。如果你想在 parent 到 child 的选择器标签中提供一些 html 然后使用内部 child 模板。