@@ -53,12 +53,16 @@ import { NSRouterLink } from "./ns-router-link";
53
53
*
54
54
* @stable
55
55
*/
56
- @Directive ( { selector : "[nsRouterLinkActive]" } )
56
+ @Directive ( {
57
+ selector : "[nsRouterLinkActive]" ,
58
+ exportAs : "routerLinkActive" ,
59
+ } )
57
60
export class NSRouterLinkActive implements OnChanges , OnDestroy , AfterContentInit { // tslint:disable-line:max-line-length directive-class-suffix
58
61
@ContentChildren ( NSRouterLink ) links : QueryList < NSRouterLink > ;
59
62
60
63
private classes : string [ ] = [ ] ;
61
64
private subscription : Subscription ;
65
+ private active : boolean = false ;
62
66
63
67
@Input ( ) nsRouterLinkActiveOptions : { exact : boolean } = { exact : false } ;
64
68
@@ -70,6 +74,10 @@ export class NSRouterLinkActive implements OnChanges, OnDestroy, AfterContentIni
70
74
} ) ;
71
75
}
72
76
77
+ get isActive ( ) : boolean {
78
+ return this . active ;
79
+ }
80
+
73
81
ngAfterContentInit ( ) : void {
74
82
this . links . changes . subscribe ( ( ) => this . update ( ) ) ;
75
83
this . update ( ) ;
@@ -91,12 +99,16 @@ export class NSRouterLinkActive implements OnChanges, OnDestroy, AfterContentIni
91
99
if ( ! this . links ) {
92
100
return ;
93
101
}
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 ) ;
100
112
}
101
113
102
114
private reduceList ( currentUrlTree : UrlTree , q : QueryList < any > ) : boolean {
@@ -106,4 +118,14 @@ export class NSRouterLinkActive implements OnChanges, OnDestroy, AfterContentIni
106
118
this . nsRouterLinkActiveOptions . exact ) ;
107
119
} , false ) ;
108
120
}
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
+
109
131
}
0 commit comments