ngx-url-params
v1.0.1
Published
Advanced Angular service for managing URL query params with reactive features, debounce handling and state sync.
Maintainers
Readme
ngx-url-params
Lightweight Angular service for managing and synchronizing URL query parameters with a concise, reactive API.
Overview
ngx-url-params provides a focused service to read, update and observe URL query parameters. The service maintains an internal state (a BehaviorSubject) and can be synchronized with Angular's Router / ActivatedRoute by calling init(router, route).
Installation
npm install ngx-url-paramsQuick start
Inject UrlParamsService in a component or service and call init(router, route) where both Router and ActivatedRoute are available.
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { UrlParamsService } from 'ngx-url-params';
@Component({ selector: 'app-demo', template: '' })
export class DemoComponent implements OnInit {
constructor(
private readonly urlParams: UrlParamsService,
private readonly router: Router,
private readonly route: ActivatedRoute
) {}
ngOnInit(): void {
this.urlParams.init(this.router, this.route);
this.urlParams.setParam('view', 'list');
}
}If init is not called the service still offers the local reactive API (get/set/observe) but will not write to the URL.
Public API (summary)
init(router: Router, route: ActivatedRoute): voidgetParams(): Record<string, any>getParam<T = any>(key: string): T | nullgetParamOrDefault<T>(key: string, fallback: T): TrequireParam<T>(key: string): ThasParam(key: string): booleangetParamKeys(): string[]setParam(key: string, value: any): voidsetParams(params: Record<string, any>): voidsetParamIfNotExists(key: string, value: any): voidsetNumberParam(key: string, value: any): voidsetNullableParam(key: string, value: any): voidremoveParam(key: string): voidclearParams(): voidremoveParamIf(key: string, predicate: (value: any) => boolean): voidremoveParamsIf(predicate: (key: string, value: any) => boolean): voidtoggleParam(key: string, valueA: any, valueB: any): voidtoggleBoolean(key: string): voidcycleParam(key: string, values: any[]): voidappendToListParam<T = any>(key: string, item: T): voidremoveFromListParam<T = any>(key: string, item: T): voidonParamsChange(): Observable<Record<string, any>>onParamChange<T>(key: string): Observable<T | undefined>
Behavior notes
- The service keeps an internal
BehaviorSubjectand provides debounced observables of param changes. - When
init(router, route)is called the service:- initializes state from
ActivatedRoute.snapshot.queryParams; - subscribes to
route.queryParamsto keep internal state in sync; - persists state changes to the URL using
router.navigate([], { relativeTo: route, queryParams, queryParamsHandling: 'merge', replaceUrl: true }).
- initializes state from
Examples
urlParams.appendToListParam('tags', 'beta');
urlParams.removeFromListParam('tags', 'beta');
urlParams.removeParamIf('page', v => Number(v) === 1);
urlParams.onParamsChange().subscribe(params => {
// react to param changes
});Contributing
Contributions welcome. Open issues/PRs with tests and clear rationale.
License
MIT
