From 2602b039b4bbb4d1a77a576c67dda6c7f22cfd39 Mon Sep 17 00:00:00 2001 From: Tobias Bosch Date: Fri, 24 Feb 2017 16:28:14 -0800 Subject: [PATCH] fix(animations): ignore triggers that are registered multiple times (#14723) --- .../animations/src/render/dom_animation_engine.ts | 4 ++-- .../animations/src/render/noop_animation_engine.ts | 8 ++++++-- .../animations/test/engine/dom_animation_engine_spec.ts | 6 ++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/@angular/platform-browser/animations/src/render/dom_animation_engine.ts b/modules/@angular/platform-browser/animations/src/render/dom_animation_engine.ts index c13e834124..7b9372e69f 100644 --- a/modules/@angular/platform-browser/animations/src/render/dom_animation_engine.ts +++ b/modules/@angular/platform-browser/animations/src/render/dom_animation_engine.ts @@ -40,7 +40,7 @@ export class DomAnimationEngine { private _elementTriggerStates = new Map(); - private _triggers: {[triggerName: string]: AnimationTrigger} = {}; + private _triggers: {[triggerName: string]: AnimationTrigger} = Object.create(null); private _triggerListeners = new Map(); constructor(private _driver: AnimationDriver, private _normalizer: AnimationStyleNormalizer) {} @@ -58,7 +58,7 @@ export class DomAnimationEngine { registerTrigger(trigger: AnimationTriggerMetadata, name: string = null): void { name = name || trigger.name; if (this._triggers[name]) { - throw new Error(`The provided animation trigger "${name}" has already been registered!`); + return; } this._triggers[name] = buildTrigger(name, trigger.definitions); } diff --git a/modules/@angular/platform-browser/animations/src/render/noop_animation_engine.ts b/modules/@angular/platform-browser/animations/src/render/noop_animation_engine.ts index 3818c25655..58100c0d2d 100644 --- a/modules/@angular/platform-browser/animations/src/render/noop_animation_engine.ts +++ b/modules/@angular/platform-browser/animations/src/render/noop_animation_engine.ts @@ -32,9 +32,14 @@ export class NoopAnimationEngine extends AnimationEngine { private _changes: ChangeTuple[] = []; private _flaggedRemovals = new Set(); private _onDoneFns: (() => any)[] = []; - private _triggerStyles: {[triggerName: string]: {[stateName: string]: ɵStyleData}} = {}; + private _triggerStyles: {[triggerName: string]: {[stateName: string]: ɵStyleData}} = + Object.create(null); registerTrigger(trigger: AnimationTriggerMetadata, name: string = null): void { + name = name || trigger.name; + if (this._triggerStyles[name]) { + return; + } const stateMap: {[stateName: string]: ɵStyleData} = {}; trigger.definitions.forEach(def => { if (def.type === AnimationMetadataType.State) { @@ -42,7 +47,6 @@ export class NoopAnimationEngine extends AnimationEngine { stateMap[stateDef.name] = normalizeStyles(stateDef.styles.styles); } }); - name = name || trigger.name; this._triggerStyles[name] = stateMap; } diff --git a/modules/@angular/platform-browser/animations/test/engine/dom_animation_engine_spec.ts b/modules/@angular/platform-browser/animations/test/engine/dom_animation_engine_spec.ts index 900347484c..3829b10113 100644 --- a/modules/@angular/platform-browser/animations/test/engine/dom_animation_engine_spec.ts +++ b/modules/@angular/platform-browser/animations/test/engine/dom_animation_engine_spec.ts @@ -39,12 +39,10 @@ export function main() { } describe('trigger registration', () => { - it('should throw an error if the same trigger is registered twice', () => { + it('should ignore and not throw an error if the same trigger is registered twice', () => { const engine = makeEngine(); engine.registerTrigger(trigger('trig', [])); - expect(() => { - engine.registerTrigger(trigger('trig', [])); - }).toThrowError(/The provided animation trigger "trig" has already been registered!/); + expect(() => { engine.registerTrigger(trigger('trig', [])); }).not.toThrow(); }); });