4

我一直在尝试使用@HostBinding装饰设置动画参数,但它似乎不起作用,我错过了什么

animations: [
    trigger('animateMe', [
      state('void', style({ opacity: 0 })),
      transition(':enter, :leave', [ // void <=> *
        animate('{{ easeTime}}ms {{ transitionTimingFn }}')
      ])
    ])
  ]

和主机绑定

@HostBinding('@animateMe') state = {
    value: 'void',
    params: {
      easeTime: 5000
    }
  };
4

3 回答 3

11

如果将 getter 函数添加到主机绑定属性,则可以设置动画参数。

trigger: any;
easingTime = 5000;

@HostBinding('@animateMe') 
get fn() {
    return {
        value: this.trigger,
        params: {
            easeTime: this.easingTime
        }
    }
};
于 2018-07-25T15:02:41.837 回答
2

宿主元素中的动画应该像这样处理:

animations: [
    trigger('toggleDrawer', [
        state('closed', style({
            transform: 'translateX(0)'
        })),
        state('opened', style({
            transform: 'translateX(80vw)'
        })),
        transition('closed <=> opened', animate(300))
    ])
]

和 HostBinding / HostListener

private state: 'opened' | 'closed' = 'closed';

// binds the animation to the host component
@HostBinding('@toggleDrawer') get getToggleDrawer(): string {
    return this.state === 'closed' ? 'opened' : 'closed';
}

@HostListener('@toggleDrawer.start', ['$event']) startDrawerHandler(event: any): void {
    console.log(event);
}

@HostListener('@toggleDrawer.done', ['$event']) doneDrawerHandler(event: any): void {
    console.log(event);
}

请记住,HostListeners 将在加载时执行来自状态 void 的事件(fromState:“void”),我不知道这是否可以从动画声明中阻止,或者您是否只需要在如果您想防止某些事情发生,则使用 HostListeners。

于 2019-05-22T09:24:16.400 回答
0

不幸的是,这不起作用,因为动画是在组件实际生成之前创建的(此代码在 @Component 元数据中)。

类之外的任何代码都不会在同一范围内。

另外,我不确定,但我没想到您可以使用@HostBinding 绑定到动画,相反,您可以像这样使用动画回调:

  <ul>
    <li *ngFor="let hero of heroes"
        (@flyInOut.start)="animationStarted($event)"
        (@flyInOut.done)="animationDone($event)"
        [@flyInOut]="'in'">
      {{hero.name}}
    </li>
  </ul>

参考:https ://angular.io/guide/animations#animation-callbacks

于 2018-04-09T07:37:02.617 回答