angular - 如何在 false *ngIf 删除元素之前捕获它?

标签 angular animation

首先,这是描述我的项目设置的最低限度示例

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

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

例如

@Component({
    selector: 'parent-component'
    // ... component metadata
})
export class ParentComponent implements AfterContentInit{

    @ContentChildren(ChildDirective) _children: QueryList<ChildDirective>

}

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

<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 的范围,因为有很多条件决定播放哪些动画,所以我需要在代码中执行此操作。

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

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

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


总结

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

如果不是,达到这个效果的最优方案是什么?

最佳答案

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

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

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

关于angular - 如何在 false *ngIf 删除元素之前捕获它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48289924/

相关文章:

ios - Swift - NSTimer 延迟遍历数组

html - 如何聚焦 FormArray 内的控件?

angular - 如何从 Angular 属性指令中访问元素 HTML?

unit-testing - Angular 2 TestBed,没有依赖注入(inject)的模拟方法

jquery 多个按钮下移,每个按钮有延迟

CSS 动画 (@keyframes) 正在加热 CPU

javascript - 如何在没有后端的情况下发送 Angular 6 表单?

javascript - 如何在 angular2 应用程序中导航回来?

ios - 无法为 UISearchBar 的框架或边界设置动画

iphone - 更平滑的慢速旋转 UIImage