gpt4 book ai didi

Angular @ContentChildren 不适用于

转载 作者:行者123 更新时间:2023-12-04 16:07:24 25 4
gpt4 key购买 nike

我正在尝试在 Angular 中创建一个树组件,如下所示:

@Component({
selector: 'app-tree',
template: `
<div style.padding-left.px="{{depth*20}}">
<ng-content></ng-content>
</div>
`
})
export class TreeComponent implements AfterContentInit {
private _depth = 0;
get depth() {
return this._depth;
}
set depth(value: number) {
this._depth = value;
this.updateChildren();
}

@Input() isRoot: boolean;

@ContentChildren(TreeComponent) children: QueryList<TreeComponent>;

ngAfterContentInit() {
if (this.isRoot) {
console.log('i am root', this.children.filter(tree => tree !== this).length);
this.updateChildren();
}
}

private updateChildren() {
this.children
.filter(tree => tree !== this)
.forEach(branch => {
branch.depth = this.depth + 1;
});
}
}

这在使用带标记的组件时效果很好。像这样:

<app-tree [isRoot]="true">
Label 1
<app-tree>
Label 1.1
</app-tree>
<app-tree>
Label 1.2
<app-tree>
Label 1.2.1
</app-tree>
</app-tree>
<app-tree>
Label 1.3
</app-tree>
</app-tree>

但是在根据数据渲染Tree时失败了,例如:

<ng-template #treeTemplate let-tree let-root="isRoot">
<app-tree *ngFor="let node of tree" [isRoot]="root">
{{ node.text }}
<ng-container *ngTemplateOutlet="treeTemplate; context:{$implicit:node.children}"></ng-container>
</app-tree>
</ng-template>
<ng-container *ngTemplateOutlet="treeTemplate; context:{$implicit:treeModel, isRoot:true}"></ng-container>

此代码基于模型递归地呈现树节点,该模型可能是这样的:

treeModel = [
{
text: 'Lorem ipsum',
children: [
{
text: 'Lorem ipsum',
children: [
{
text: 'Lorem ipsum',
children: [
{ text: 'Lorem ipsum' },
{ text: 'Lorem ipsum' },
{ text: 'Lorem ipsum' }
]
},
{ text: 'Lorem ipsum' },
{ text: 'Lorem ipsum' },
{ text: 'Lorem ipsum' }
]
},
{ text: 'Lorem ipsum' },
{ text: 'Lorem ipsum' },
{ text: 'Lorem ipsum' }
]
}
];

这不起作用,因为从模板渲染树。似乎在将组件包装在 ng-template 中时,@ContentChildren 无法找到从模板呈现的子项。

这是预期的吗?任何可能的解决方案、解决方法?

另一个问题(尽管问题较少)是 ContentChildren 包含主机组件;因此 this.children.filter(tree => tree !== this)

Plunker 链接:https://embed.plnkr.co/jRXk8eI0mz7db6eliMoj/

最佳答案

有一个Open issue in Angular对于这个问题。

报告问题的人在链接中提供了解决方法,但我发现它相当麻烦,而且我相信它会导致性能不佳。

关于Angular @ContentChildren 不适用于 <ng-template>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48185447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com