UNPKG

@tarktech/ngx-context

Version:

Angular Context: Easy property binding for router outlet and nested component trees.

82 lines 10.4 kB
import { Directive, Input, Optional, SkipSelf, TemplateRef, ViewContainerRef, } from '@angular/core'; import { Subject } from 'rxjs'; import { filter, startWith, takeUntil } from 'rxjs/operators'; import { parseKeys } from './internals'; import { ContextProviderComponent } from './provider.component'; import * as i0 from "@angular/core"; import * as i1 from "./provider.component"; export class Context { $implicit = {}; } export class ContextDisposerDirective { tempRef; vcRef; provider; destroy$ = new Subject(); _dispose = ''; view; set dispose(dispose) { this._dispose = dispose || ''; } get dispose() { return this._dispose; } constructor(tempRef, vcRef, provider) { this.tempRef = tempRef; this.vcRef = vcRef; this.provider = provider; } init() { const disposed = parseKeys(this.dispose); this.provider.reset$ .pipe(takeUntil(this.destroy$)) .subscribe(() => this.ngOnChanges()); if (this.provider.provide.length) this.provider.change$ .pipe(takeUntil(this.destroy$), startWith(...Array.from(this.provider.provided.keys())), filter(key => !!key)) .subscribe(providerKey => this.syncProperties(disposed, providerKey)); } reset() { this.view = this.vcRef.createEmbeddedView(this.tempRef, new Context()); } syncProperties(disposed, providerKey) { const key = this.provider.contextMap[providerKey] || providerKey; if (disposed.length && disposed.indexOf(key) < 0) return; const value = this.provider.component[providerKey]; this.view.context.$implicit[key] = value; this.view.context[key] = value; this.view.markForCheck(); } ngOnChanges() { this.ngOnDestroy(); this.reset(); if (this.provider && this.tempRef && this.vcRef) this.init(); } ngOnDestroy() { this.destroy$.next(); if (this.view) this.vcRef.clear(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ContextDisposerDirective, deps: [{ token: i0.TemplateRef, optional: true }, { token: i0.ViewContainerRef, optional: true }, { token: i1.ContextProviderComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.7", type: ContextDisposerDirective, selector: "[contextDisposer]", inputs: { dispose: ["contextDisposer", "dispose"] }, usesOnChanges: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: ContextDisposerDirective, decorators: [{ type: Directive, args: [{ selector: '[contextDisposer]', }] }], ctorParameters: function () { return [{ type: i0.TemplateRef, decorators: [{ type: Optional }] }, { type: i0.ViewContainerRef, decorators: [{ type: Optional }] }, { type: i1.ContextProviderComponent, decorators: [{ type: Optional }, { type: SkipSelf }] }]; }, propDecorators: { dispose: [{ type: Input, args: ['contextDisposer'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcG9zZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbnRleHQvc3JjL2xpYi9kaXNwb3Nlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsUUFBUSxFQUNSLFFBQVEsRUFDUixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRWhFLE1BQU0sT0FBTyxPQUFPO0lBQ2xCLFNBQVMsR0FBMkIsRUFBRSxDQUFDO0NBQ3hDO0FBS0QsTUFBTSxPQUFPLHdCQUF3QjtJQWV6QjtJQUVBO0lBR0E7SUFuQkYsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsUUFBUSxHQUFzQixFQUFFLENBQUM7SUFDakMsSUFBSSxDQUF1QjtJQUVuQyxJQUNJLE9BQU8sQ0FBQyxPQUEwQjtRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsWUFFVSxPQUF5QixFQUV6QixLQUF1QixFQUd2QixRQUFrQztRQUxsQyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUV6QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUd2QixhQUFRLEdBQVIsUUFBUSxDQUEwQjtJQUN6QyxDQUFDO0lBRUksSUFBSTtRQUNWLE1BQU0sUUFBUSxHQUFhLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO2FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPO2lCQUNsQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQ3ZELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FDckI7aUJBQ0EsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sS0FBSztRQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQWtCLEVBQUUsV0FBbUI7UUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDO1FBRWpFLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXpELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7dUdBbkVVLHdCQUF3QjsyRkFBeEIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzswQkFlSSxRQUFROzswQkFFUixRQUFROzswQkFFUixRQUFROzswQkFDUixRQUFROzRDQWJQLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBFbWJlZGRlZFZpZXdSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPcHRpb25hbCxcclxuICBTa2lwU2VsZixcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IHBhcnNlS2V5cyB9IGZyb20gJy4vaW50ZXJuYWxzJztcclxuaW1wb3J0IHsgQ29udGV4dFByb3ZpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9wcm92aWRlci5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xyXG4gICRpbXBsaWNpdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tjb250ZXh0RGlzcG9zZXJdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbnRleHREaXNwb3NlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIF9kaXNwb3NlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xyXG4gIHByaXZhdGUgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XHJcblxyXG4gIEBJbnB1dCgnY29udGV4dERpc3Bvc2VyJylcclxuICBzZXQgZGlzcG9zZShkaXNwb3NlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5fZGlzcG9zZSA9IGRpc3Bvc2UgfHwgJyc7XHJcbiAgfVxyXG4gIGdldCBkaXNwb3NlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNwb3NlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgcHJpdmF0ZSB0ZW1wUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIHByaXZhdGUgdmNSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQFNraXBTZWxmKClcclxuICAgIHByaXZhdGUgcHJvdmlkZXI6IENvbnRleHRQcm92aWRlckNvbXBvbmVudCxcclxuICApIHt9XHJcblxyXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRpc3Bvc2VkOiBzdHJpbmdbXSA9IHBhcnNlS2V5cyh0aGlzLmRpc3Bvc2UpO1xyXG5cclxuICAgIHRoaXMucHJvdmlkZXIucmVzZXQkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5nT25DaGFuZ2VzKCkpO1xyXG5cclxuICAgIGlmICh0aGlzLnByb3ZpZGVyLnByb3ZpZGUubGVuZ3RoKVxyXG4gICAgICB0aGlzLnByb3ZpZGVyLmNoYW5nZSRcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICAgIHN0YXJ0V2l0aCguLi5BcnJheS5mcm9tKHRoaXMucHJvdmlkZXIucHJvdmlkZWQua2V5cygpKSksXHJcbiAgICAgICAgICBmaWx0ZXIoa2V5ID0+ICEha2V5KSxcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZShwcm92aWRlcktleSA9PiB0aGlzLnN5bmNQcm9wZXJ0aWVzKGRpc3Bvc2VkLCBwcm92aWRlcktleSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlldyA9IHRoaXMudmNSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcFJlZiwgbmV3IENvbnRleHQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNQcm9wZXJ0aWVzKGRpc3Bvc2VkOiBzdHJpbmdbXSwgcHJvdmlkZXJLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5wcm92aWRlci5jb250ZXh0TWFwW3Byb3ZpZGVyS2V5XSB8fCBwcm92aWRlcktleTtcclxuXHJcbiAgICBpZiAoZGlzcG9zZWQubGVuZ3RoICYmIGRpc3Bvc2VkLmluZGV4T2Yoa2V5KSA8IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucHJvdmlkZXIuY29tcG9uZW50W3Byb3ZpZGVyS2V5XTtcclxuXHJcbiAgICB0aGlzLnZpZXcuY29udGV4dC4kaW1wbGljaXRba2V5XSA9IHZhbHVlO1xyXG4gICAgdGhpcy52aWV3LmNvbnRleHRba2V5XSA9IHZhbHVlO1xyXG4gICAgdGhpcy52aWV3Lm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICB0aGlzLm5nT25EZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgaWYgKHRoaXMucHJvdmlkZXIgJiYgdGhpcy50ZW1wUmVmICYmIHRoaXMudmNSZWYpIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuXHJcbiAgICBpZiAodGhpcy52aWV3KSB0aGlzLnZjUmVmLmNsZWFyKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==