如何在假 *ngIf 删除元素之前捕获元素?



首先,这里有一个最低限度的例子来描述我的项目设置

该项目使用的是 Angular v5,因此它应该可以访问框架中最新的 API。

假设我有一个父组件,其查询列表为ContentChildren

前任。

@Component({
selector: 'parent-component'
// ... component metadata
})
export class ParentComponent implements AfterContentInit{
@ContentChildren(ChildDirective) _children: QueryList<ChildDirective>
}

此父组件的模板包含一个 ngContent 选择器,用于查找使用子指令选择器标记的元素

<ng-content select="[childDirective]"></ng-content>

现在这是一个使用父组件的页面组件,使用ngIf结构指令动态显示 0 个或多个带有子指令标记的组件:

// template for some component class "PageComponent"
<div>
<!-- 
This is the parent we defined before 
And it contains multiple ContentChildren
-->
<parent-component> 
<span childDirective *ngIf="showFirst()">First</span>
<span childDirective *ngIf="showSecond()">Second</span>
<span childDirective *ngIf="showThird()">Third</span>
</parent-component>
</div>

这是我试图解决的问题

在这个父组件中,每当这些子指令元素中的任何一个离开或进入时,我都想编排一个复杂的动画。这不仅仅是使用AnimationMetadata的东西,因为有很多条件决定了播放哪些动画,所以我需要在代码中执行此操作。

同样,此动画需要在父组件而不是页面组件中进行编排,因为无论使用父组件,动画都是相同的,并且将在许多地方使用。

通常,我会注入AnimationBuilder并根据需要进行动画。这次的问题是因为内容子级正在被ngIf'd删除,当ngif为false时,它会立即将它们从页面中删除,我无法在它们离开之前捕获它们并在其上运行动画。我知道如果我能在这里使用动画元数据,那就像使用query(':leave')一样简单,但如前所述,我不能使用动画元数据来解决这个问题。

看到角度提供了一种钩接到通过元数据离开的元素的方法,我希望有一种方法可以在实际的类代码中做到这一点。我只是不确定如何。


总结一下

当 ContentChild 上的 ngIf 为假时,我可以挂上它,执行动画,然后在我说它很酷之后让 ngIf 完成将元素带走吗?

如果没有,实现此效果的最佳解决方案是什么?

最近的评论使我再次研究这个问题,因为我从未找到令人满意的解决方案。但是重新审视它,我意识到我可以制作自己的结构指令来模拟 ngIf 逻辑并附加可用于动画或其他清理的回调,并且只有在回调完成后才将其从视图中删除。

这是一个快速的黑客示例,可以适应其他用例

https://stackblitz.com/edit/angular-oex7ah?file=src%2Fapp%2Fanimated-if.directive.ts

最新更新