@@ -42,7 +42,7 @@ class NavigationData {
4242export class QueryParamGroupService implements OnDestroy {
4343
4444 /** The {@link QueryParamGroup} to bind. */
45- private queryParamGroup : QueryParamGroup ;
45+ private queryParamGroup : QueryParamGroup | null = null ;
4646
4747 /** List of {@link QueryParamAccessor} registered to this service. */
4848 private directives = new Map < string , QueryParamAccessor [ ] > ( ) ;
@@ -122,7 +122,7 @@ export class QueryParamGroupService implements OnDestroy {
122122 } )
123123 ) . pipe (
124124 // Do not synchronize while the param is detached from the group
125- filter ( ( ) => ! ! this . queryParamGroup . get ( queryParamName ) ) ,
125+ filter ( ( ) => ! ! this . getQueryParamGroup ( ) . get ( queryParamName ) ) ,
126126 map ( ( newValue : unknown [ ] ) => this . getParamsForValue ( partitionedQueryParam , partitionedQueryParam . reduce ( newValue ) ) ) ,
127127 takeUntil ( this . destroy$ ) ,
128128 ) . subscribe ( params => this . enqueueNavigation ( new NavigationData ( params ) ) ) ;
@@ -154,7 +154,7 @@ export class QueryParamGroupService implements OnDestroy {
154154 } ) ;
155155
156156 this . directives . delete ( queryParamName ) ;
157- const queryParam = this . queryParamGroup . get ( queryParamName ) ;
157+ const queryParam = this . getQueryParamGroup ( ) . get ( queryParamName ) ;
158158 if ( queryParam ) {
159159 queryParam . _clearChangeFunctions ( ) ;
160160 }
@@ -170,10 +170,14 @@ export class QueryParamGroupService implements OnDestroy {
170170
171171 /** Listens for programmatic changes on group level and synchronizes to the router. */
172172 private setupGroupChangeListener ( ) : void {
173- this . queryParamGroup . _registerOnChange ( ( newValue : Record < string , unknown > ) => {
173+ this . getQueryParamGroup ( ) . _registerOnChange ( ( newValue : Record < string , unknown > | null ) => {
174+ if ( newValue === null ) {
175+ throw new Error ( `Received null value from QueryParamGroup.` ) ;
176+ }
177+
174178 let params : Params = { } ;
175179 Object . keys ( newValue ) . forEach ( queryParamName => {
176- const queryParam = this . queryParamGroup . get ( queryParamName ) ;
180+ const queryParam = this . getQueryParamGroup ( ) . get ( queryParamName ) ;
177181 if ( isMissing ( queryParam ) ) {
178182 return ;
179183 }
@@ -187,12 +191,12 @@ export class QueryParamGroupService implements OnDestroy {
187191
188192 /** Listens for programmatic changes on parameter level and synchronizes to the router. */
189193 private setupParamChangeListeners ( ) : void {
190- Object . keys ( this . queryParamGroup . queryParams )
194+ Object . keys ( this . getQueryParamGroup ( ) . queryParams )
191195 . forEach ( queryParamName => this . setupParamChangeListener ( queryParamName ) ) ;
192196 }
193197
194198 private setupParamChangeListener ( queryParamName : string ) : void {
195- const queryParam = this . queryParamGroup . get ( queryParamName ) ;
199+ const queryParam = this . getQueryParamGroup ( ) . get ( queryParamName ) ;
196200 if ( ! queryParam ) {
197201 throw new Error ( `No param in group found for name ${ queryParamName } ` ) ;
198202 }
@@ -211,7 +215,7 @@ export class QueryParamGroupService implements OnDestroy {
211215 // particular group; however, we do need to react if one of our parameters has
212216 // vanished when it was set before.
213217 distinctUntilChanged ( ( previousMap , currentMap ) => {
214- const keys = Object . values ( this . queryParamGroup . queryParams )
218+ const keys = Object . values ( this . getQueryParamGroup ( ) . queryParams )
215219 . map ( queryParam => this . wrapIntoPartition ( queryParam ) )
216220 . map ( partitionedQueryParam => partitionedQueryParam . queryParams . map ( queryParam => queryParam . urlParam ) )
217221 . reduce ( ( a , b ) => [ ...a , ...b ] , [ ] ) ;
@@ -227,9 +231,9 @@ export class QueryParamGroupService implements OnDestroy {
227231 const synthetic = this . isSyntheticNavigation ( ) ;
228232 const groupValue : Record < string , unknown > = { } ;
229233
230- Object . keys ( this . queryParamGroup . queryParams ) . forEach ( queryParamName => {
234+ Object . keys ( this . getQueryParamGroup ( ) . queryParams ) . forEach ( queryParamName => {
231235 const partitionedQueryParam = this . getQueryParamAsPartition ( queryParamName ) ;
232- const newValues = partitionedQueryParam . queryParams . map ( queryParam => isMultiQueryParam ( queryParam )
236+ const newValues = partitionedQueryParam . queryParams . map ( queryParam => isMultiQueryParam < unknown > ( queryParam )
233237 ? queryParam . deserializeValue ( queryParamMap . getAll ( queryParam . urlParam ) )
234238 : queryParam . deserializeValue ( queryParamMap . get ( queryParam . urlParam ) )
235239 ) ;
@@ -243,7 +247,7 @@ export class QueryParamGroupService implements OnDestroy {
243247 groupValue [ queryParamName ] = newValue ;
244248 } ) ;
245249
246- this . queryParamGroup . setValue ( groupValue , {
250+ this . getQueryParamGroup ( ) . setValue ( groupValue , {
247251 emitEvent : ! synthetic ,
248252 emitModelToViewChange : false ,
249253 } ) ;
@@ -252,7 +256,7 @@ export class QueryParamGroupService implements OnDestroy {
252256
253257 /** Listens for newly added parameters and starts synchronization for them. */
254258 private watchNewParams ( ) : void {
255- this . queryParamGroup . queryParamAdded$ . pipe (
259+ this . getQueryParamGroup ( ) . queryParamAdded$ . pipe (
256260 takeUntil ( this . destroy$ )
257261 ) . subscribe ( queryParamName => {
258262 this . setupParamChangeListener ( queryParamName ) ;
@@ -342,7 +346,7 @@ export class QueryParamGroupService implements OnDestroy {
342346 * This merges the global configuration with the group specific configuration.
343347 */
344348 private get routerOptions ( ) : RouterOptions {
345- const groupOptions = this . queryParamGroup ? this . queryParamGroup . routerOptions : { } ;
349+ const groupOptions = this . getQueryParamGroup ( ) . routerOptions ;
346350
347351 return {
348352 ...( this . globalRouterOptions || { } ) ,
@@ -358,7 +362,7 @@ export class QueryParamGroupService implements OnDestroy {
358362 * query parameters independent of whether they are partitioned.
359363 */
360364 private getQueryParamAsPartition ( queryParamName : string ) : PartitionedQueryParam < unknown > {
361- const queryParam = this . queryParamGroup . get ( queryParamName ) ;
365+ const queryParam = this . getQueryParamGroup ( ) . get ( queryParamName ) ;
362366 if ( ! queryParam ) {
363367 throw new Error ( `Could not find query param with name ${ queryParamName } . Did you forget to add it to your QueryParamGroup?` ) ;
364368 }
@@ -382,4 +386,12 @@ export class QueryParamGroupService implements OnDestroy {
382386 } ) ;
383387 }
384388
389+ private getQueryParamGroup ( ) : QueryParamGroup {
390+ if ( ! this . queryParamGroup ) {
391+ throw new Error ( `No QueryParamGroup has been registered yet.` ) ;
392+ }
393+
394+ return this . queryParamGroup ;
395+ }
396+
385397}
0 commit comments