Blake,
With Greensock, sometimes integration with ngAnimate simply complicates things. Often we want to run animations without assigning class styles; we want to animate in a clear fashion without trying to remember how a class change triggers [thru ngAnimate] animation callbacks to our custom TweenMax code.
Here is revised implementation of the solution presented in your Plunkr:
CodePen - AngularJS with TweenMax Chains
created a $timeline animation service to hide all the details of sequences, using TweenMax, etc. In turn, the main `AnimationController` simply uses the injected $timeline service as follows:
$timeline.start(
target,
function onStartCallback( action ){ $scope.progress[name][action] = "running..."; },
function onDoneCallback( action ){ $scope.progress[name][action] = "finished"; }
)
This starts the animation sequence on any specified target. Of course, this implies that the animation [sequences] are fixed... but that was the assumption used in your previous application.
This code leverages promise chaining heavily and uses callback-interceptors to resolve pending promises... And internally I use the nice trick of `[ ].reduce( )` to sequence 1..n promises in a sequential promise chain. It is also super easy to delay the start of any other animations. Thanks for you Plunk. It inspired me to create something cleaner without the use of ngAnimate and simultaneously keeping my directive logic clean 'n lean.
I think ngAnimate is really great for animation of elements that are added or removed from the DOM... or even for animating via CSS elements whose animation is simple. For complex choreographies, I think GSAP-direct is the best solution.