角度动画:如何在模板中动态绑定动画触发器名称?

时间:2017-11-18 11:36:56

标签: angular angular-directive angular-animations

我想知道是否有办法在模板中动态绑定动画触发器名称。

以下是模板 app.component.html 中的动画div:

<div [@animationTriggerName]>
  ...
</div>

以下是 app.module.ts

...
@NgModule({
  imports:      [...],
  declarations: [ ..., AnimationTriggerNameDirective ],
  bootstrap:    [...]
})

这是 app.component.ts

@Component({
  ...
})
export class AppComponent  {
  ...
  animationTriggerName = 'slideInOut';
}

@Directive({
  selector: '[animationTriggerName]'
})
export class AnimationTriggerNameDirective {
  @Input() animationTriggerName: string;
  constructor() {}
}

我希望能够动态设置变量 animationTriggerName 。 因此,如果我将其设置为 myTriggerName ,那么在模板中我会将其渲染:

<div [@myTriggerName]>
  ...
</div>

因此,触发器名称为 myTriggerName 的动画将能够运行。

2 个答案:

答案 0 :(得分:2)

我有类似问题,如发布的问题,到目前为止我使用ngSwitch和ngSwitchCase作为解决方法,因为我在尝试anderror之后未能进行变量绑定。我不认为下面的示例是最佳解决方案,因为如果我想将触发器名称切换为100,这将是乏味的,但它现在适用于我,在运行时更改触发器名称,希望有一些其他更好的主意,并希望它有所帮助

<div [ngSwitch]="child.animationName" >
 <input *ngSwitchCase="flyInOut" [@flyInOut]="'in'"  ...>
 <input *ngSwitchCase="fadeIn" [@fadeIn]="'in'"  ...> 
 <input *ngSwitchDefault [@flyRotateInOut]="'in'" ...>
</div> 

答案 1 :(得分:2)

在我从这篇文章中学习之后。看起来使用多个状态比使用触发器名称更容易,所以我更改了我的代码结构,如下所示,下面是您的参考的原始帖子https://angularfirebase.com/lessons/hammerjs-angular-5-animations-for-mobile-gestures-tutorial/

@Component({
  selector: 'hammer-card',
  templateUrl: './hammer-card.component.html',
  styleUrls: ['./hammer-card.component.sass'],
  animations: [
    trigger('cardAnimator', [
      transition('* => wobble', animate(1000, keyframes(kf.wobble))),
      transition('* => swing', animate(1000, keyframes(kf.swing))),
      transition('* => jello', animate(1000, keyframes(kf.jello))),
      transition('* => zoomOutRight', animate(1000, keyframes(kf.zoomOutRight))),
      transition('* => slideOutLeft', animate(1000, keyframes(kf.slideOutLeft))),
      transition('* => rotateOutUpRight', animate(1000, keyframes(kf.rotateOutUpRight))),
      transition('* => flipOutY', animate(1000, keyframes(kf.flipOutY))),
    ])
  ]
})