feat(animations): re-introduce support for transition matching functions (#20723)
Closes #18959 PR Close #20723
This commit is contained in:
parent
c26e1bba1d
commit
590d93b30d
@ -115,7 +115,7 @@ export interface AnimationStateMetadata extends AnimationMetadata {
|
|||||||
* @experimental Animation support is experimental.
|
* @experimental Animation support is experimental.
|
||||||
*/
|
*/
|
||||||
export interface AnimationTransitionMetadata extends AnimationMetadata {
|
export interface AnimationTransitionMetadata extends AnimationMetadata {
|
||||||
expr: string;
|
expr: string|((fromState: string, toState: string) => boolean);
|
||||||
animation: AnimationMetadata|AnimationMetadata[];
|
animation: AnimationMetadata|AnimationMetadata[];
|
||||||
options: AnimationOptions|null;
|
options: AnimationOptions|null;
|
||||||
}
|
}
|
||||||
@ -836,7 +836,8 @@ export function keyframes(steps: AnimationStyleMetadata[]): AnimationKeyframesSe
|
|||||||
* @experimental Animation support is experimental.
|
* @experimental Animation support is experimental.
|
||||||
*/
|
*/
|
||||||
export function transition(
|
export function transition(
|
||||||
stateChangeExpr: string, steps: AnimationMetadata | AnimationMetadata[],
|
stateChangeExpr: string | ((fromState: string, toState: string) => boolean),
|
||||||
|
steps: AnimationMetadata | AnimationMetadata[],
|
||||||
options: AnimationOptions | null = null): AnimationTransitionMetadata {
|
options: AnimationOptions | null = null): AnimationTransitionMetadata {
|
||||||
return {type: AnimationMetadataType.Transition, expr: stateChangeExpr, animation: steps, options};
|
return {type: AnimationMetadataType.Transition, expr: stateChangeExpr, animation: steps, options};
|
||||||
}
|
}
|
||||||
|
@ -255,6 +255,45 @@ export function main() {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should allow a transition to use a function to determine what method to run', () => {
|
||||||
|
let valueToMatch = '';
|
||||||
|
const transitionFn =
|
||||||
|
(fromState: string, toState: string) => { return toState == valueToMatch; };
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'if-cmp',
|
||||||
|
template: '<div [@myAnimation]="exp"></div>',
|
||||||
|
animations: [
|
||||||
|
trigger('myAnimation', [transition(
|
||||||
|
transitionFn,
|
||||||
|
[style({opacity: 0}), animate(1234, style({opacity: 1}))])]),
|
||||||
|
]
|
||||||
|
})
|
||||||
|
class Cmp {
|
||||||
|
exp: any = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
TestBed.configureTestingModule({declarations: [Cmp]});
|
||||||
|
|
||||||
|
const fixture = TestBed.createComponent(Cmp);
|
||||||
|
const cmp = fixture.componentInstance;
|
||||||
|
valueToMatch = cmp.exp = 'something';
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
let players = getLog();
|
||||||
|
expect(players.length).toEqual(1);
|
||||||
|
let [p1] = players;
|
||||||
|
expect(p1.totalTime).toEqual(1234);
|
||||||
|
resetLog();
|
||||||
|
|
||||||
|
valueToMatch = 'something-else';
|
||||||
|
cmp.exp = 'this-wont-match';
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
players = getLog();
|
||||||
|
expect(players.length).toEqual(0);
|
||||||
|
});
|
||||||
|
|
||||||
it('should allow a state value to be `0`', () => {
|
it('should allow a state value to be `0`', () => {
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'if-cmp',
|
selector: 'if-cmp',
|
||||||
|
@ -172,7 +172,7 @@ export interface AnimationStyleMetadata extends AnimationMetadata {
|
|||||||
/** @experimental */
|
/** @experimental */
|
||||||
export interface AnimationTransitionMetadata extends AnimationMetadata {
|
export interface AnimationTransitionMetadata extends AnimationMetadata {
|
||||||
animation: AnimationMetadata | AnimationMetadata[];
|
animation: AnimationMetadata | AnimationMetadata[];
|
||||||
expr: string;
|
expr: string | ((fromState: string, toState: string) => boolean);
|
||||||
options: AnimationOptions | null;
|
options: AnimationOptions | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ export declare function style(tokens: '*' | {
|
|||||||
}>): AnimationStyleMetadata;
|
}>): AnimationStyleMetadata;
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
export declare function transition(stateChangeExpr: string, steps: AnimationMetadata | AnimationMetadata[], options?: AnimationOptions | null): AnimationTransitionMetadata;
|
export declare function transition(stateChangeExpr: string | ((fromState: string, toState: string) => boolean), steps: AnimationMetadata | AnimationMetadata[], options?: AnimationOptions | null): AnimationTransitionMetadata;
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
export declare function trigger(name: string, definitions: AnimationMetadata[]): AnimationTriggerMetadata;
|
export declare function trigger(name: string, definitions: AnimationMetadata[]): AnimationTriggerMetadata;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user