Angular 有一个名为CdkStepper的“步进器”实现,它非常强大。基本上,CdkStepper 具有实现步骤的CdkStep DOM 子节点,并且很聪明地通过“下一个”和“上一个”事件在步骤之间推进。我需要编写一个多级步进器,如下所示:
<my-stepper>
<my-step>Hi there</my-step>
<my-stepper>
<my-step>How's it going?</my-step>
<my-step>Good?</my-step>
</my-stepper>
</my-stepper>
在哪里my-stepper
延伸CdkStepper
和my-step
延伸CdkStep
。(那里缺少很多东西,但这抓住了要点。)阻止我的是这样CdkStepper
做:
@ContentChildren(CdkStep, {descendants: true}) _steps: QueryList<CdkStep>;
而不是这个:
@ContentChildren(CdkStep) _steps: QueryList<CdkStep>;
这意味着顶层步进器会抓取从它下降的整个 DOM 树中的所有步骤。所以在这种情况下,它就像我说的那样:
<my-stepper>
<my-step>Hi there</my-step>
<my-stepper>
<my-step>How's it going?</my-step>
<my-step>Good?</my-step>
</my-stepper>
<my-step>How's it going?</my-step>
<my-step>Good?</my-step>
</my-stepper>
这不太理想。我看过的解决方案包括:
- 我可以写一些特别的东西来复制大部分内容
CdkStepper
。(糟糕的想法。) - 我可以复制整个实现,然后只改变一件事。(几乎一样可怕。)
- 我可以找到一种方法来覆盖
CdkStepper
.
一件事是行不通的;你不能在装饰器参数中有一个实例变量(所以我不能做类似的事情:
@Input() descendants = false;
@ContentChildren(CdkStep, {descendants: this.descendants}) _steps: QueryList<CdkStep>;
因为装饰器适用于类,而不是实例,因此this
在这种情况下毫无意义。
那么我应该在这里做什么?有没有一种方法可以extends
用来覆盖最小值并获得我想要的行为?还有什么?处理这种情况的最佳实践方法是什么?