如何在Angular 2中创建可重用的动画

Ric*_*ahl 51 angular2-animation angular

我正在使用动画API,我想创建一个可重复使用的动画,比如说在顶级路由器视图的内容中滑动.我设法通过时髦的元数据语法(实际上非​​常酷,一旦超过使用元数据的疯狂想法)来使动画主要工作.

   @Component({
      //moduleId: module.id,
      selector: 'album-display',
      templateUrl: './albumDisplay.html',
      animations: [
        trigger('slideIn', [
          state('*', style({
            transform: 'translateX(100%)',
          })),
          state('in', style({
            transform: 'translateX(0)',
          })),
          state('out',   style({
            transform: 'translateX(-100%)',
          })),
          transition('* => in', animate('600ms ease-in')),
          transition('in => out', animate('600ms ease-in'))
        ])
      ]
  })
  export class AlbumDisplay implements OnInit {
      slideInState = 'in';
      ...
  }
Run Code Online (Sandbox Code Playgroud)

然后将其分配给组件中的顶级元素:

  <div  class="container" [@slideIn]="slideInState">
Run Code Online (Sandbox Code Playgroud)

所以这有效,但我怎样才能使这个可重用?我不想将这些元数据粘贴到每个视图上.由于这是元数据,我不确定如何使这个可重用.

ran*_*al9 87

一种可能的方法是将动画触发器代码放在单独的文件中并将其导出为const变量并在组件中使用它,如下所示.

animations.ts

import { trigger, state, style, transition, animate } from '@angular/core';

export const slideIn = trigger('slideIn', [
  state('*', style({
    transform: 'translateX(100%)',
  })),
  state('in', style({
    transform: 'translateX(0)',
  })),
  state('out',   style({
    transform: 'translateX(-100%)',
  })),
  transition('* => in', animate('600ms ease-in')),
  transition('in => out', animate('600ms ease-in'))
]);
Run Code Online (Sandbox Code Playgroud)

专辑-display.component.ts

import { slideIn } from './animations'; // path to your animations.ts file

@Component({
    //moduleId: module.id,
    selector: 'album-display',
    templateUrl: './albumDisplay.html',
    animations: [
      slideIn
    ]
})
export class AlbumDisplay implements OnInit {
    slideInState = 'in';
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案将阻止您使用AOT编译:/ (3认同)
  • 谢谢你,完美的工作.在最初想到WTF关于这个基于元的基于元的实现之后,在使用这种语法创建一些之后,结果很容易为组件创建动画. (2认同)
  • 我知道这是一个古老的话题,但有关如何在AOT编译中使用它的任何想法? (2认同)
  • 这确实适用于AOT - 也许它不是一年前,但现在确实如此 (2认同)

Ale*_*aul 25

也许它有点晚了,但我仍然想为一个更动态的触发器版本提供答案.

将动画触发器代码放在单独的文件中并将其导出为function.

translate.ts

import { AnimationEntryMetadata, trigger, state, style, transition, animate } from '@angular/core';

export function TranslateX( name: string, x: string, duration: number ): AnimationEntryMetadata {
    return trigger( name, [
            state('false', style({ transform: 'translateX(0)' }) ),
            state('true',  style({ transform: 'translateX(' + x + ')' }) ),
            transition('0 => 1', animate( duration + 'ms ease-in')),
            transition('1 => 0', animate( duration + 'ms ease-out')),
        ]);
}
Run Code Online (Sandbox Code Playgroud)

所以,在组件app.component.ts中

import { TranslateX } from './translate';

@Component({
    ...
    templateUrl: './app.component.html',
    animations:   [ 
                    TranslateX( 'trigger1Title','-100%', 200 ),
                    TranslateX( 'trigger2Title','20vw', 700 )
                  ]
    ...
})
Run Code Online (Sandbox Code Playgroud)

并在模板app.component.html中

...
<div [@trigger1Title]="token1"> ... </div>
<div [@trigger2Title]="token2"> ... </div>
...
Run Code Online (Sandbox Code Playgroud)

您可以使用更多输入数据自定义触发器,例如分隔转换时间,等等.

  • 与AOT编译一起使用时,这将失败 (3认同)
  • 你是对的,而且,正如你所看到的,在这个例子中没有使用反引号. (2认同)