Можете ли вы переместить анимацию во внешний файл в Angular2?
Аннотация @Component
предоставляет нам свойство animations
. Это можно использовать для определения списка triggers
, каждый из которых имеет множество свойств state
и transition
.
Когда вы добавляете несколько анимаций в компонент, этот список может стать довольно длинным. Также некоторые анимации было бы очень приятно использовать и в других компонентах. Положить их прямо в каждый компонент кажется утомительным и повторяющимся - плюс он нарушает принцип DRY.
Вы также можете определить свойства шаблона и стилей на своем компоненте, но здесь вы можете вместо этого указать templateUrl
и styleUrls
. Я не могу найти свойство animationUrls
- я что-то пропустил - есть ли способ сделать это?
Ответы
Ответ 1
Что вы можете. Вы можете просто объявить анимацию в другом файле, а затем импортировать ее туда, где вам нужно
animations.ts
export const animation = trigger(...)
component.ts
import { animation } from './animations'
@Component({
animations: [ animation ]
})
Или, если вы хотите сделать его настраиваемым, вы можете экспортировать функцию. Например, взгляните на срыв Fuel-UI. Это многоразовая (и настраиваемая) анимация
collapse.ts
export function Collapse(duration: number = 300) {
return trigger('collapse', [
...
])
}
Тогда в ваших компонентах просто используйте
import { Collapse } from './collapse'
@Component({
animations: [ Collapse(300) ],
template: '
<div @collapse="collapsed ? 'true' : 'false'">
</div>
'
})
class MyComponent {}
Ответ 2
Конечно, это возможно. Вы можете создать, например, animations.ts
и позволить ему экспортировать все виды констант анимации:
export const PRETTY_ANIMATION = trigger('heroState', [
state('inactive', style({
backgroundColor: '#eee',
transform: 'scale(1)'
})),
state('active', style({
backgroundColor: '#cfd8dc',
transform: 'scale(1.1)'
})),
transition('inactive => active', animate('100ms ease-in')),
transition('active => inactive', animate('100ms ease-out'))
])
и в вашем компоненте вы можете импортировать эту анимацию, используя оператор import
:
import {PRETTY_ANIMATION} from 'animations';
и примените его к вашему компоненту:
@Component({
selector : '...'
animations : [PRETTY_ANIMATION]
})
Ответ 3
Вы, конечно, и джентльмены сделали это в некоторых из его примеров репозитория github. Возьмите следующее:
route_animations.ts
import {
trigger,
animate,
style,
transition
} from '@angular/core';
var startingStyles = (styles) => {
styles['position'] = 'fixed';
styles['top'] = 0;
styles['left'] = 0;
styles['right'] = 0;
styles['height'] = '100%';
return styles;
}
export default function(name) {
return trigger(name, [
transition('void => *', [
style(startingStyles({
transform: 'translateX(100%)'
})),
animate('0.5s ease-out', style({ transform: 'translateX(0%)'}))
]),
transition('* => void', [
style(startingStyles({
transform: 'translateX(0%)'
})),
animate('0.5s ease-in', style({ transform: 'translateX(-100%)'}))
])
]);
}
Который затем импортируется в компонент, как показано ниже:
import {default as routerAnimations} from '../route_animations';
И затем вызывается так под анимацией Param при инициализации компонента:
animations: [routerAnimations('route')],
Взгляните на это сами, чтобы получить лучшее представление, но я надеюсь, что это поможет. https://github.com/matsko/ng2eu-2016-code/blob/master
Слава мацко.
Ответ 4
Вот еще один пример исчезновения анимации в Angular 4, который я использую для анимации маршрутов.
// import the required animation functions from the angular animations module
import { trigger, state, animate, transition, style } from '@angular/animations';
export const fadeInAnimation =
// trigger name for attaching this animation to an element using the [@triggerName] syntax
trigger('fadeInAnimation', [
// route 'enter' transition
transition(':enter', [
// css styles at start of transition
style({ opacity: 0 }),
// animation and styles at end of transition
animate('.3s', style({ opacity: 1 }))
]),
]);
И компонент с переходом прилагается
import { Component } from '@angular/core';
// import fade in animation
import { fadeInAnimation } from '../_animations/index';
@Component({
moduleId: module.id.toString(),
templateUrl: 'home.component.html',
// make fade in animation available to this component
animations: [fadeInAnimation],
// attach the fade in animation to the host (root) element of this component
host: { '[@fadeInAnimation]': '' }
})
export class HomeComponent {
}
Более подробная информация и живая демонстрация в этом посте