UNPKG

@ngqp/core

Version:

Synchronizing form controls with the URL for Angular

62 lines 7.88 kB
import { Directive, Inject, Input, Optional, Self } from '@angular/core'; import { QueryParamGroupService } from './query-param-group.service'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { selectValueAccessor } from '../accessors/util'; import { QueryParamGroup } from '../model/query-param-group'; /** * Binds a {@link QueryParam} to a component directly. * * This directive accepts a {@link QueryParam} without requiring an outer {@link QueryParamGroup}. * It binds this parameter to the host component, which is required to have a [ControlValueAccessor] * {@link https://angular.io/api/forms/ControlValueAccessor}. */ export class QueryParamDirective { /** @internal */ constructor(groupService, valueAccessors) { this.groupService = groupService; /** * The {@link QueryParam} to bind to the host component. */ this.queryParam = null; /** @internal */ this.name = 'param'; /** @internal */ this.group = new QueryParamGroup({}); this.valueAccessor = selectValueAccessor(valueAccessors); this.groupService.setQueryParamGroup(this.group); } /** @ignore */ ngOnChanges(changes) { const paramChange = changes['queryParam']; if (paramChange) { if (this.group.get(this.name)) { this.groupService.deregisterQueryParamDirective(this.name); this.group.remove(this.name); } if (paramChange.currentValue) { this.group.add(this.name, paramChange.currentValue); this.groupService.registerQueryParamDirective(this); } } } /** @ignore */ ngOnDestroy() { if (this.groupService) { this.groupService.deregisterQueryParamDirective(this.name); } } } QueryParamDirective.decorators = [ { type: Directive, args: [{ selector: '[queryParam]', providers: [QueryParamGroupService], },] } ]; QueryParamDirective.ctorParameters = () => [ { type: QueryParamGroupService, decorators: [{ type: Optional }] }, { type: Array, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NG_VALUE_ACCESSOR,] }] } ]; QueryParamDirective.propDecorators = { queryParam: [{ type: Input, args: ['queryParam',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL3Byb2plY3RzL25ncXAvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy9xdWVyeS1wYXJhbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUF3QixRQUFRLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdEOzs7Ozs7R0FNRztBQUtILE1BQU0sT0FBTyxtQkFBbUI7SUFpQjVCLGdCQUFnQjtJQUNoQixZQUN3QixZQUFvQyxFQUNULGNBQXNDO1FBRGpFLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQWpCNUQ7O1dBRUc7UUFFSSxlQUFVLEdBQStCLElBQUksQ0FBQztRQUVyRCxnQkFBZ0I7UUFDQSxTQUFJLEdBQUcsT0FBTyxDQUFDO1FBSy9CLGdCQUFnQjtRQUNSLFVBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQU9wQyxJQUFJLENBQUMsYUFBYSxHQUFHLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxjQUFjO0lBQ1AsV0FBVyxDQUFDLE9BQXNCO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxQyxJQUFJLFdBQVcsRUFBRTtZQUNiLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hDO1lBRUQsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO2dCQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2RDtTQUNKO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDUCxXQUFXO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlEO0lBQ0wsQ0FBQzs7O1lBcERKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsY0FBYztnQkFDeEIsU0FBUyxFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDdEM7OztZQWpCUSxzQkFBc0IsdUJBcUN0QixRQUFRO3dDQUNSLFFBQVEsWUFBSSxJQUFJLFlBQUksTUFBTSxTQUFDLGlCQUFpQjs7O3lCQWZoRCxLQUFLLFNBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBTZWxmLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBRdWVyeVBhcmFtR3JvdXBTZXJ2aWNlIH0gZnJvbSAnLi9xdWVyeS1wYXJhbS1ncm91cC5zZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1BY2Nlc3NvciB9IGZyb20gJy4vcXVlcnktcGFyYW0tYWNjZXNzb3IuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHNlbGVjdFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi9hY2Nlc3NvcnMvdXRpbCc7XG5pbXBvcnQgeyBRdWVyeVBhcmFtIH0gZnJvbSAnLi4vbW9kZWwvcXVlcnktcGFyYW0nO1xuaW1wb3J0IHsgUXVlcnlQYXJhbUdyb3VwIH0gZnJvbSAnLi4vbW9kZWwvcXVlcnktcGFyYW0tZ3JvdXAnO1xuXG4vKipcbiAqIEJpbmRzIGEge0BsaW5rIFF1ZXJ5UGFyYW19IHRvIGEgY29tcG9uZW50IGRpcmVjdGx5LlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGFjY2VwdHMgYSB7QGxpbmsgUXVlcnlQYXJhbX0gd2l0aG91dCByZXF1aXJpbmcgYW4gb3V0ZXIge0BsaW5rIFF1ZXJ5UGFyYW1Hcm91cH0uXG4gKiBJdCBiaW5kcyB0aGlzIHBhcmFtZXRlciB0byB0aGUgaG9zdCBjb21wb25lbnQsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBbQ29udHJvbFZhbHVlQWNjZXNzb3JdXG4gKiB7QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Db250cm9sVmFsdWVBY2Nlc3Nvcn0uXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3F1ZXJ5UGFyYW1dJyxcbiAgICBwcm92aWRlcnM6IFtRdWVyeVBhcmFtR3JvdXBTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJhbURpcmVjdGl2ZSBpbXBsZW1lbnRzIFF1ZXJ5UGFyYW1BY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kgIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgUXVlcnlQYXJhbX0gdG8gYmluZCB0byB0aGUgaG9zdCBjb21wb25lbnQuXG4gICAgICovXG4gICAgQElucHV0KCdxdWVyeVBhcmFtJylcbiAgICBwdWJsaWMgcXVlcnlQYXJhbTogUXVlcnlQYXJhbTx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBuYW1lID0gJ3BhcmFtJztcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgdmFsdWVBY2Nlc3NvcjogQ29udHJvbFZhbHVlQWNjZXNzb3I7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBncm91cCA9IG5ldyBRdWVyeVBhcmFtR3JvdXAoe30pO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGdyb3VwU2VydmljZTogUXVlcnlQYXJhbUdyb3VwU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTFVFX0FDQ0VTU09SKSB2YWx1ZUFjY2Vzc29yczogQ29udHJvbFZhbHVlQWNjZXNzb3JbXSxcbiAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZUFjY2Vzc29yID0gc2VsZWN0VmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29ycyk7XG4gICAgICAgIHRoaXMuZ3JvdXBTZXJ2aWNlLnNldFF1ZXJ5UGFyYW1Hcm91cCh0aGlzLmdyb3VwKTtcbiAgICB9XG5cbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFtQ2hhbmdlID0gY2hhbmdlc1sncXVlcnlQYXJhbSddO1xuXG4gICAgICAgIGlmIChwYXJhbUNoYW5nZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuZ2V0KHRoaXMubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwU2VydmljZS5kZXJlZ2lzdGVyUXVlcnlQYXJhbURpcmVjdGl2ZSh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAucmVtb3ZlKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYXJhbUNoYW5nZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwLmFkZCh0aGlzLm5hbWUsIHBhcmFtQ2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cFNlcnZpY2UucmVnaXN0ZXJRdWVyeVBhcmFtRGlyZWN0aXZlKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmdyb3VwU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cFNlcnZpY2UuZGVyZWdpc3RlclF1ZXJ5UGFyYW1EaXJlY3RpdmUodGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxufSJdfQ==