@@ -53,12 +53,16 @@ import { NSRouterLink } from "./ns-router-link";
5353 *
5454 * @stable
5555 */
56- @Directive ( { selector : "[nsRouterLinkActive]" } )
56+ @Directive ( {
57+ selector : "[nsRouterLinkActive]" ,
58+ exportAs : "routerLinkActive" ,
59+ } )
5760export class NSRouterLinkActive implements OnChanges , OnDestroy , AfterContentInit { // tslint:disable-line:max-line-length directive-class-suffix
5861 @ContentChildren ( NSRouterLink ) links : QueryList < NSRouterLink > ;
5962
6063 private classes : string [ ] = [ ] ;
6164 private subscription : Subscription ;
65+ private active : boolean = false ;
6266
6367 @Input ( ) nsRouterLinkActiveOptions : { exact : boolean } = { exact : false } ;
6468
@@ -70,6 +74,10 @@ export class NSRouterLinkActive implements OnChanges, OnDestroy, AfterContentIni
7074 } ) ;
7175 }
7276
77+ get isActive ( ) : boolean {
78+ return this . active ;
79+ }
80+
7381 ngAfterContentInit ( ) : void {
7482 this . links . changes . subscribe ( ( ) => this . update ( ) ) ;
7583 this . update ( ) ;
@@ -91,12 +99,16 @@ export class NSRouterLinkActive implements OnChanges, OnDestroy, AfterContentIni
9199 if ( ! this . links ) {
92100 return ;
93101 }
94-
95- const currentUrlTree = this . router . parseUrl ( this . router . url ) ;
96- const isActiveLinks = this . reduceList ( currentUrlTree , this . links ) ;
97- this . classes . forEach (
98- c => this . renderer . setElementClass (
99- this . element . nativeElement , c , isActiveLinks ) ) ;
102+ const hasActiveLinks = this . hasActiveLinks ( ) ;
103+ // react only when status has changed to prevent unnecessary dom updates
104+ if ( this . active !== hasActiveLinks ) {
105+ const currentUrlTree = this . router . parseUrl ( this . router . url ) ;
106+ const isActiveLinks = this . reduceList ( currentUrlTree , this . links ) ;
107+ this . classes . forEach (
108+ c => this . renderer . setElementClass (
109+ this . element . nativeElement , c , isActiveLinks ) ) ;
110+ }
111+ Promise . resolve ( hasActiveLinks ) . then ( active => this . active = active ) ;
100112 }
101113
102114 private reduceList ( currentUrlTree : UrlTree , q : QueryList < any > ) : boolean {
@@ -106,4 +118,14 @@ export class NSRouterLinkActive implements OnChanges, OnDestroy, AfterContentIni
106118 this . nsRouterLinkActiveOptions . exact ) ;
107119 } , false ) ;
108120 }
121+
122+ private isLinkActive ( router : Router ) : ( link : NSRouterLink ) => boolean {
123+ return ( link : NSRouterLink ) =>
124+ router . isActive ( link . urlTree , this . nsRouterLinkActiveOptions . exact ) ;
125+ }
126+
127+ private hasActiveLinks ( ) : boolean {
128+ return this . links . some ( this . isLinkActive ( this . router ) ) ;
129+ }
130+
109131}
0 commit comments