Параметр в анимацию Angular2
Я пытаюсь сделать простую анимацию, например, простой jQuery ниже
animate({'left' : left_indent})
Я использую анимацию Angular2, но проблема в том, как передать параметр left_indent за пределами моего класса компонентов в триггер анимации?
animations: [
trigger('flyInOut', [
state('for', style({
left: this.left_indent,
})),
transition('* => for', [
animate(2000, keyframes([
style({ opacity: 1, transform: 'translateX(0)', offset: 0 }),
style({ opacity: 1, transform: 'translateX(-300px)', offset: 0.5 }),
]))
]),
])
]
Ответы
Ответ 1
Теперь это возможно.
animations: [
trigger('flyInOut', [
state('for', style({
left: '{{left_indent}}', // use interpolation
}), {params: {left_indent: 0}}), // default parameters values required
transition('* => for', [
animate(2000, keyframes([
style({ opacity: 1, transform: 'translateX(0)', offset: 0 }),
style({ opacity: 1, transform: 'translateX(-300px)', offset: 0.5 }),
]))
]),
])
]
ОБНОВЛЕНИЕ (согласно ответу SplitterAlex):
в шаблоне (для Angular < 4.4.6):
<div [@flyInOut]="{value: triggerValue, left_indent: left_indent}"></div>
для Angular >= 4.4.6 шаблон должен быть
<div [@flyInOut]="{value: triggerValue, params: {left_indent: left_indent}}"></div>
Ответ 2
Принятый ответ не работает для меня с Angular 4.4.6
Вы должны обернуть значения param в шаблоне в объекте params
Заменить:
<div [@flyInOut]="{value: triggerValue, left_indent: left_indent}"></div>
С
<div [@flyInOut]="{value: triggerValue, params: {left_indent: left_indent}}"></div>
Ответ 3
У меня есть одно решение. Но это полезно, только если вы пытаетесь использовать одну и ту же анимацию несколько раз с разными параметрами, которые вы уже знаете.
Например, у меня есть многоразовая анимация для создания эффекта slideUp-slideDown. И в сложенном состоянии контейнер должен поддерживать некоторую высоту (которую я уже знаю для этих контейнеров).
Анимация:
import { style, trigger, state, transition, animate } from "@angular/animations";
export const slideUpDownAnimation = (height) => {
return trigger(`slideUpDownAnimation${height}`, [
state('0', style({
overflow: 'hidden',
height: '*'
})),
state('1', style({
overflow: 'hidden',
height: `${height}px`
})),
transition('1 => 0', animate('400ms ease-in-out')),
transition('0 => 1', animate('400ms ease-in-out'))
]);
};
В классе компонентов:
import { slideUpDownAnimation } from "../../animations/slide-up-down.animation";
@Component({
moduleId: module.id,
selector: 'new-order',
templateUrl: './new-order.component.html',
animations: [
slideUpDownAnimation(32), // will return trigger named "slideUpDownAnimation32"
slideUpDownAnimation(60) // will return trigger named "slideUpDownAnimation60"
]
})
export class NewOrderComponent {...
И наконец, в компоненте html:
<div class="header-fields"
[@slideUpDownAnimation32]="collapsedFields">
...
<div class="line-group"
*ngFor="let group of lineGroups; let g = index"
[@slideUpDownAnimation60]="group.collapsed">
...
К сожалению, он не может использоваться для динамических параметров, потому что вы должны определить их в декораторе и html.
Ответ 4
В настоящее время анимация допускает только статические определения значений.
Однако в соответствии с этим git запрос функции хаба, поднятый в июне 2016 года, есть план, но он по-прежнему остается включенным отставание функций для добавления.
Он еще не выпущен.