@@ -528,7 +528,7 @@ uiSrefActiveDirective = ['$state', '$stateParams', '$interpolate', '$uiRouter',
528528 restrict : 'A' ,
529529 controller : [ '$scope' , '$element' , '$attrs' ,
530530 function ( $scope : IScope , $element : IAugmentedJQuery , $attrs : any ) {
531- const states : StateData [ ] = [ ] ;
531+ let states : StateData [ ] = [ ] ;
532532 let activeEqClass : string ;
533533 let uiSrefActive : any ;
534534
@@ -543,15 +543,10 @@ uiSrefActiveDirective = ['$state', '$stateParams', '$interpolate', '$uiRouter',
543543 // Do nothing. uiSrefActive is not a valid expression.
544544 // Fall back to using $interpolate below
545545 }
546- uiSrefActive = uiSrefActive || $interpolate ( $attrs . uiSrefActive || '' , false ) ( $scope ) ;
547- if ( isObject ( uiSrefActive ) ) {
548- forEach ( uiSrefActive , function ( stateOrName : StateOrName , activeClass : string ) {
549- if ( isString ( stateOrName ) ) {
550- const ref = parseStateRef ( stateOrName ) ;
551- addState ( ref . state , $scope . $eval ( ref . paramExpr ) , activeClass ) ;
552- }
553- } ) ;
546+ if ( ! uiSrefActive ) {
547+ uiSrefActive = $interpolate ( $attrs . uiSrefActive || '' , false ) ( $scope ) ;
554548 }
549+ setStatesFromDefinitionObject ( uiSrefActive ) ;
555550
556551 // Allow uiSref to communicate with uiSrefActive[Equals]
557552 this . $$addStateInfo = function ( newState : string , newParams : Obj ) {
@@ -568,13 +563,38 @@ uiSrefActiveDirective = ['$state', '$stateParams', '$interpolate', '$uiRouter',
568563 function updateAfterTransition ( trans ) {
569564 trans . promise . then ( update , noop ) ;
570565 }
571-
572- $scope . $on ( '$stateChangeSuccess' , update ) ;
573- $scope . $on ( '$destroy' , < any > $uiRouter . transitionService . onStart ( { } , updateAfterTransition ) ) ;
566+ $scope . $on ( '$destroy' , setupEventListeners ( ) ) ;
574567 if ( $uiRouter . globals . transition ) {
575568 updateAfterTransition ( $uiRouter . globals . transition ) ;
576569 }
577570
571+ function setupEventListeners ( ) {
572+ const deregisterStatesChangedListener = $uiRouter . stateRegistry . onStatesChanged ( handleStatesChanged ) ;
573+ const deregisterOnStartListener = $uiRouter . transitionService . onStart ( { } , updateAfterTransition ) ;
574+ const deregisterStateChangeSuccessListener = $scope . $on ( '$stateChangeSuccess' , update ) ;
575+ return function cleanUp ( ) {
576+ deregisterStatesChangedListener ( ) ;
577+ deregisterOnStartListener ( ) ;
578+ deregisterStateChangeSuccessListener ( ) ;
579+ } ;
580+ }
581+
582+ function handleStatesChanged ( ) {
583+ setStatesFromDefinitionObject ( uiSrefActive ) ;
584+ }
585+
586+ function setStatesFromDefinitionObject ( statesDefinition : any ) {
587+ if ( isObject ( statesDefinition ) ) {
588+ states = [ ] ;
589+ forEach ( statesDefinition , function ( stateOrName : StateOrName , activeClass : string ) {
590+ if ( isString ( stateOrName ) ) {
591+ const ref = parseStateRef ( stateOrName ) ;
592+ addState ( ref . state , $scope . $eval ( ref . paramExpr ) , activeClass ) ;
593+ }
594+ } ) ;
595+ }
596+ }
597+
578598 function addState ( stateName : string , stateParams : Obj , activeClass : string ) {
579599 const state = $state . get ( stateName , stateContext ( $element ) ) ;
580600
0 commit comments