Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

fix(ngAnimate): allow removal of class that is scheduled to be added … #14760

Merged
merged 1 commit into from
Jun 22, 2016

Conversation

Narretz
Copy link
Contributor

@Narretz Narretz commented Jun 13, 2016

What kind of change does this PR introduce? (Bug fix, feature, docs update, ...)
bug fix

What is the current behavior? (You can also link to an open issue here)
See #14582

Please check if the PR fulfills these requirements

Other information:

…with requestAnimationFrame

The following case can happen when ngClass updates an element's classes in very quick order in the following way:

  • First animation adds class "a"
  • A digest passes, but "a" is not yet added to the element
  • Second animation adds class "b"
  • No digest passes, and "a" is still not added to the element,
    because requestAnimationFrame hasn't been flushed yet
  • Third animation removes class "a"
  • the third animation gets merged into the second animation

Before this change:

  • Because the element doesn't have class "a" yet, ngAnimate
    resolves that it cannot remove class "a". However,
    the first animation is still running, and finally adds "a"

After this change:

  • ngAnimate reacts to the temporary class "add-a", which indicates
    that "a" is about to be added and decides that "a" can be removed
    after all.

This is a very rare case where setting the element's class
is not fast enough, and subsequent animations operate on incorrect assumptions.

"In the wild", this is caused by rapidly updating ngClass,
which uses inidvidual addClass and removeClass calls when both operations happen in a single digest.

Fixes #14582

…with requestAnimationFrame

The following case can happen when ngClass updates an element's classes in very quick order in the following way:

- First animation adds class "a"
- A digest passes, but "a" is not yet added to the element
- Second animation adds class "b"
- No digest passes, and "a" is still not added to the element,
  because requestAnimationFrame hasn't been flushed yet
- Third animation removes class "a"
- the third animation gets merged into the second animation

Before this change:

- Because the element doesn't have class "a" yet, ngAnimate
resolves that it cannot remove class "a". However,
the first animation is still running, and finally adds "a"

After this change:

- ngAnimate reacts to the temporary class "add-a", which indicates
that "a" is about to be added and decides that "a" can be removed
after all.

This is a very rare case where setting the element's class
is not fast enough, and subsequent animations operate on incorrect assumptions.

"In the wild", this is caused by rapidly updating ngClass,
which uses inidvidual addClass and removeClass calls when both operations happen in a single digest.

Fixes angular#14582
@gkalpak
Copy link
Member

gkalpak commented Jun 15, 2016

LGTM

@Narretz Narretz merged commit 22ec93b into angular:master Jun 22, 2016
Narretz added a commit that referenced this pull request Jun 23, 2016
…with requestAnimationFrame

Also affects the reverse case, adding a class that is scheduled to be removed with rAF.

The following case can happen when ngClass updates an element's classes in very quick order in the following way:

- First animation adds class "a"
- A digest passes, but "a" is not yet added to the element
- Second animation adds class "b"
- No digest passes, and "a" is still not added to the element,
  because requestAnimationFrame hasn't been flushed yet
- Third animation removes class "a"
- the third animation gets merged into the second animation

Before this change:

- Because the element doesn't have class "a" yet, ngAnimate
resolves that it cannot remove class "a". However,
the first animation is still running, and finally adds "a"

After this change:

- ngAnimate reacts to the temporary class "add-a", which indicates
that "a" is about to be added and decides that "a" can be removed
after all.

This is a very rare case where setting the element's class
is not fast enough, and subsequent animations operate on incorrect assumptions.

"In the wild", this is caused by rapidly updating ngClass,
which uses inidvidual addClass and removeClass calls when both operations happen in a single digest.

Fixes #14582
PR  (#14760)
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ngAnimate & ngClass - Does not remove a class that is still animating
3 participants