我有一个表单组件,其中包含字段,某些字段我想在表单中显示时进行动画处理,但不是每个字段。
<div *ngFor="let field of form.Fields">
<div [ngSwitch]="field.Type" [@slideOut]>
<!-- more field stuff -->
</div>
</div>
使用其他属性,我可以执行类似[attr.required]="field.Required"
的操作,但[attr.@slideOut]
似乎不起作用。
理想情况下,我希望在我的字段上有一个动画属性,这样我就可以传递像[@field.Animation]
这样的动画,但我找不到任何关于如何做这样的事情的文档。有什么想法吗?
答案 0 :(得分:10)
我遇到了类似的问题,发现你需要采取稍微不同的方法。
在Angular中,动画与状态有关。因此,您不想在HTML中为动画定义不同的触发器,而是要定义触发器可以在组件类中查看的多个状态。而不是直接从方法触发动画,而是设置动画链接到的对象的状态。
因此,例如,我可以在导入必要的模块后在组件装饰器中定义以下内容。
625px * 0.7 * 0.24 = 105px
在这个例子中,我正在实例化元素时使动画发生。在ngOnInit()方法中,我将this.watchMe设置为“fly”或“fade”。
在html中我附加了flyInOut触发器,如下所示:
@Component({
selector: 'app-some-animated',
templateUrl: './some.component.html',
styleUrls: ['./some-animated.component.scss'],
animations: [
trigger('flyInOut', [
transition("void => fly", [
animate(300, keyframes([
style({transform: 'translateX(100%)', opacity: 0}),
style({transform: 'translateX(0)', opacity: 1})
]))
]
)
]),
trigger('flyInOut', [
transition("void => fade", [
animate(300, keyframes([
style({opacity: 0}),
style({opacity: 1})
]))
]
)
])
]
})
在您的情况下,您可能希望将所需状态添加到字段对象中,或者作为* ngFor中的可迭代条件。
来自coursetro的This article也有很好的解释和视频。
答案 1 :(得分:7)
要有条件地启用或禁用动画触发器,请使用https://angular.io/api/animations/trigger#disabling-animations上记录的[@ .disabled]
以OP中的示例为例,如果每个字段都具有带有布尔值的“ required”属性,并且仅应在为true的情况下应用动画,则代码可能为:
<div *ngFor="let field of form.Fields">
<div [@slideOut] [@.disabled]="!field.required">
<!-- more field stuff -->
</div>
</div>
值得一提的是,在组件上使用[@ .disabled]也会禁用所有子组件上的动画,例如材质菜单的外观将不再具有动画效果。
在必要的情况下,可以通过使用条件将父动画上的动画的持续时间设置为0(在视觉上)删除动画而不影响任何子组件来避免这种情况。
模板:
<div *ngFor="let field of form.Fields">
<div [@slideOut]="field.required ? {value:'', params:{duration : 200}} : {value:'', params:{duration : 0}}">
<!-- more field stuff -->
</div>
</div>
动画:
trigger('slideOut', [
transition(':enter', [
style({ opacity: '0' }),
animate('{{duration}}ms cubic-bezier(0.4, 0.0, 0.2, 1)'),
style({ opacity: '1' })
])
])