@tarktech/ngx-context
Version:
Angular Context: Easy property binding for router outlet and nested component trees.
82 lines • 10.4 kB
JavaScript
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==