Параметр в анимации Angular2

Я пытаюсь сделать простую анимацию, такую ​​как простой jQuery ниже

animate({'left' : left_indent})

Я использую Angular2 Animations, но проблема в том, как передать параметр 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 }),
            ]))
        ]),
    ])
]

person ahrberg    schedule 31.01.2017    source источник


Ответы (4)


Теперь это возможно.

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>
person EvgenyV    schedule 01.09.2017
comment
Пробовали этот подход безуспешно, любая документация, на которую вы можете указать, при передаче входных значений в анимацию lib? Такая ультрасовременная особенность, ничего не найти. - person Christopher Marshall; 15.09.2017
comment
@ChristopherMarshall, в первую очередь эта функция работает в angular-анимации ›4.2. Есть хорошее руководство yearofmoo.com/2017/06/ new-wave-of-animation-features.html - person EvgenyV; 17.09.2017
comment
Спасибо за ресурс. - person Christopher Marshall; 18.09.2017
comment
Что такое triggerValue в приведенном выше примере? - person theOwl; 07.08.2019
comment
@theOwl, triggerValue - это свойство в вашем компоненте, значение которого может иметь значение, объявленное в каком-то состоянии в ваших AnimationTriggerMetadata. В этом случае он может быть равен «за». Когда triggerValue изменяется, например от someValue до for ('* = ›for') происходит анимация - person EvgenyV; 08.08.2019
comment
Вы знаете, где я могу найти набор текста для объекта параметров? Я хотел бы определить объект внутри своего компонента. - person muuvmuuv; 13.05.2020

Принятый ответ не работает для меня с Angular 4.4.6

Вы должны обернуть значения параметров в шаблоне в объект params

Заменять:

<div [@flyInOut]="{value: triggerValue, left_indent: left_indent}"></div>

С участием:

<div [@flyInOut]="{value: triggerValue, params: {left_indent: left_indent}}"></div>
person SplitterAlex    schedule 27.10.2017
comment
неважно, я был неправ. Вы были тем парнем, который изначально указал на эту деталь, а затем принятый ответ был обновлен. - person ; 24.08.2018

у меня есть одно решение. Но это полезно только в том случае, если вы пытаетесь использовать одну и ту же анимацию несколько раз с разными параметрами, которые вам уже известны.

Например, у меня есть многоразовая анимация для создания эффекта 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.

person Viktor Sanzharevsky    schedule 16.06.2017
comment
Спасибо тебе, друг. Это не динамично, но, по крайней мере, это обходной путь для angular 2 - person yngrdyn; 03.05.2018
comment
Благодарность ! это спасло мне день. Не полностью динамичен, но все же можно настроить и выполнить работу. - person Abhinav Kumar; 08.09.2019
comment
Пока это только хороший ответ. Если вы хотите использовать значение анимации по умолчанию с * ngIf, это только один способ. Это angular8, и они все еще не исправили это. github.com/angular/angular/issues/19866 - person Verri; 12.09.2019
comment
Для создания приложения мне нужно изменить const slideUpDownAnimation = (height) => на function slideUpDownAnimation (height) - person Verri; 13.09.2019

В настоящее время анимация допускает только статические определения значений.

Однако в соответствии с этим запросом функции концентратора git, поднятым в июне 2016 г., есть план но, похоже, он все еще находится в списке функций, которые нужно добавить.

Он еще не выпущен.

person Christopher Moore    schedule 01.02.2017