@@ -528,7 +528,7 @@ uiSrefActiveDirective = ['$state', '$stateParams', '$interpolate', '$uiRouter',
528
528
restrict : 'A' ,
529
529
controller : [ '$scope' , '$element' , '$attrs' ,
530
530
function ( $scope : IScope , $element : IAugmentedJQuery , $attrs : any ) {
531
- const states : StateData [ ] = [ ] ;
531
+ let states : StateData [ ] = [ ] ;
532
532
let activeEqClass : string ;
533
533
let uiSrefActive : any ;
534
534
@@ -543,15 +543,10 @@ uiSrefActiveDirective = ['$state', '$stateParams', '$interpolate', '$uiRouter',
543
543
// Do nothing. uiSrefActive is not a valid expression.
544
544
// Fall back to using $interpolate below
545
545
}
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 ) ;
554
548
}
549
+ setStatesFromDefinitionObject ( uiSrefActive ) ;
555
550
556
551
// Allow uiSref to communicate with uiSrefActive[Equals]
557
552
this . $$addStateInfo = function ( newState : string , newParams : Obj ) {
@@ -568,13 +563,38 @@ uiSrefActiveDirective = ['$state', '$stateParams', '$interpolate', '$uiRouter',
568
563
function updateAfterTransition ( trans ) {
569
564
trans . promise . then ( update , noop ) ;
570
565
}
571
-
572
- $scope . $on ( '$stateChangeSuccess' , update ) ;
573
- $scope . $on ( '$destroy' , < any > $uiRouter . transitionService . onStart ( { } , updateAfterTransition ) ) ;
566
+ $scope . $on ( '$destroy' , setupEventListeners ( ) ) ;
574
567
if ( $uiRouter . globals . transition ) {
575
568
updateAfterTransition ( $uiRouter . globals . transition ) ;
576
569
}
577
570
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
+
578
598
function addState ( stateName : string , stateParams : Obj , activeClass : string ) {
579
599
const state = $state . get ( stateName , stateContext ( $element ) ) ;
580
600
0 commit comments