L'annotation @Component
nous fournit une propriété animations
. Ceci peut être utilisé pour définir une liste de triggers
, chacune avec beaucoup de propriétés state
et transition
.
Lorsque vous ajoutez plusieurs animations à un composant, cette liste peut devenir assez longue. De plus, certaines animations seraient vraiment sympas à utiliser dans d'autres composants. Avoir à les mettre directement dans chaque composant semble fastidieux et est répétitif - plus cela viole le principe DRY.
Vous pouvez également définir les propriétés de modèle et de style sur votre composant, mais vous avez ici la possibilité de fournir templateUrl
et styleUrls
à la place. Je n'arrive pas à trouver une propriété animationUrls
- quelque chose me manque-t-il - y a-t-il un moyen de le faire?
Sûr que vous pouvez. Vous pouvez simplement déclarer l'animation dans un fichier différent, puis l'importer où vous en avez besoin
animations.ts
export const animation = trigger(...)
composant.ts
import { animation } from './animations'
@Component({
animations: [ animation ]
})
Ou si vous voulez le rendre configurable, vous pouvez exporter une fonction. Par exemple, jetez un coup d'œil à Combustible d'interface utilisateur . Ceci est une animation réutilisable (et configurable)
collapse.ts
export function Collapse(duration: number = 300) {
return trigger('collapse', [
...
])
}
Ensuite, dans vos composants, utilisez simplement
import { Collapse } from './collapse'
@Component({
animations: [ Collapse(300) ],
template: `
<div @collapse="collapsed ? 'true' : 'false'">
</div>
`
})
class MyComponent {}
Bien sûr que c'est possible. Vous pouvez par exemple créer un animations.ts
et le laisser exporter toutes sortes de constantes d'animation:
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'))
])
et dans votre composant, vous pouvez importer cette animation à l'aide de l'instruction import
:
import {PRETTY_ANIMATION} from 'animations';
et l'appliquer à votre composant:
@Component({
selector : `...`
animations : [PRETTY_ANIMATION]
})
Vous et les messieurs l’avez certainement fait dans certains de ses exemples de github repo. Prenez ce qui suit:
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%)'}))
])
]);
}
Ce qui est ensuite importé dans un composant comme suit:
import {default as routerAnimations} from '../route_animations';
Et ensuite appelé comme ceci sous l'animation Param lors de l'initialisation du composant:
animations: [routerAnimations('route')],
Jetez-y un coup d'œil vous-même pour en avoir une meilleure idée, mais j'espère que cela vous aidera. https://github.com/matsko/ng2eu-2016-code/blob/master
Bravo à Matsko.
Voici un autre exemple d'animation en fondu dans Angular 4 que j'utilise pour animer des itinéraires
// 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 }))
]),
]);
Et un composant avec la transition attachée
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 {
}
Plus de détails et une démonstration en direct sur this post