ngx-context
Version:
Angular Context: Easy property binding for router outlet and nested component trees.
72 lines • 9.06 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';
export class Context {
constructor() {
this.$implicit = {};
}
}
export class ContextDisposerDirective {
constructor(tempRef, vcRef, provider) {
this.tempRef = tempRef;
this.vcRef = vcRef;
this.provider = provider;
this.destroy$ = new Subject();
this._dispose = '';
}
set dispose(dispose) {
this._dispose = dispose || '';
}
get dispose() {
return this._dispose;
}
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();
}
}
ContextDisposerDirective.decorators = [
{ type: Directive, args: [{
selector: '[contextDisposer]',
},] }
];
ContextDisposerDirective.ctorParameters = () => [
{ type: TemplateRef, decorators: [{ type: Optional }] },
{ type: ViewContainerRef, decorators: [{ type: Optional }] },
{ type: ContextProviderComponent, decorators: [{ type: Optional }, { type: SkipSelf }] }
];
ContextDisposerDirective.propDecorators = {
dispose: [{ type: Input, args: ['contextDisposer',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcG9zZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbnRleHQvc3JjL2xpYi9kaXNwb3Nlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsUUFBUSxFQUNSLFFBQVEsRUFDUixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRSxNQUFNLE9BQU8sT0FBTztJQUFwQjtRQUNFLGNBQVMsR0FBMkIsRUFBRSxDQUFDO0lBQ3pDLENBQUM7Q0FBQTtBQUtELE1BQU0sT0FBTyx3QkFBd0I7SUFhbkMsWUFFVSxPQUF5QixFQUV6QixLQUF1QixFQUd2QixRQUFrQztRQUxsQyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUV6QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUd2QixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQW5CcEMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDL0IsYUFBUSxHQUFzQixFQUFFLENBQUM7SUFtQnRDLENBQUM7SUFoQkosSUFDSSxPQUFPLENBQUMsT0FBMEI7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQVlPLElBQUk7UUFDVixNQUFNLFFBQVEsR0FBYSxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTthQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTztpQkFDbEIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3hCLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUN2RCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQ3JCO2lCQUNBLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVPLEtBQUs7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVPLGNBQWMsQ0FBQyxRQUFrQixFQUFFLFdBQW1CO1FBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQztRQUVqRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUV6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUViLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQyxDQUFDOzs7WUF0RUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7YUFDOUI7OztZQWRDLFdBQVcsdUJBNkJSLFFBQVE7WUE1QlgsZ0JBQWdCLHVCQThCYixRQUFRO1lBekJKLHdCQUF3Qix1QkEyQjVCLFFBQVEsWUFDUixRQUFROzs7c0JBZFYsS0FBSyxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBTa2lwU2VsZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHBhcnNlS2V5cyB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB7IENvbnRleHRQcm92aWRlckNvbXBvbmVudCB9IGZyb20gJy4vcHJvdmlkZXIuY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICAkaW1wbGljaXQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NvbnRleHREaXNwb3Nlcl0nLFxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0RGlzcG9zZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9kaXNwb3NlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuICBwcml2YXRlIHZpZXc6IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xuXG4gIEBJbnB1dCgnY29udGV4dERpc3Bvc2VyJylcbiAgc2V0IGRpc3Bvc2UoZGlzcG9zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9kaXNwb3NlID0gZGlzcG9zZSB8fCAnJztcbiAgfVxuICBnZXQgZGlzcG9zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3Bvc2U7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByaXZhdGUgdGVtcFJlZjogVGVtcGxhdGVSZWY8YW55PixcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByaXZhdGUgdmNSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQE9wdGlvbmFsKClcbiAgICBAU2tpcFNlbGYoKVxuICAgIHByaXZhdGUgcHJvdmlkZXI6IENvbnRleHRQcm92aWRlckNvbXBvbmVudCxcbiAgKSB7fVxuXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaXNwb3NlZDogc3RyaW5nW10gPSBwYXJzZUtleXModGhpcy5kaXNwb3NlKTtcblxuICAgIHRoaXMucHJvdmlkZXIucmVzZXQkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubmdPbkNoYW5nZXMoKSk7XG5cbiAgICBpZiAodGhpcy5wcm92aWRlci5wcm92aWRlLmxlbmd0aClcbiAgICAgIHRoaXMucHJvdmlkZXIuY2hhbmdlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgc3RhcnRXaXRoKC4uLkFycmF5LmZyb20odGhpcy5wcm92aWRlci5wcm92aWRlZC5rZXlzKCkpKSxcbiAgICAgICAgICBmaWx0ZXIoa2V5ID0+ICEha2V5KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHByb3ZpZGVyS2V5ID0+IHRoaXMuc3luY1Byb3BlcnRpZXMoZGlzcG9zZWQsIHByb3ZpZGVyS2V5KSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMudmlldyA9IHRoaXMudmNSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcFJlZiwgbmV3IENvbnRleHQoKSk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNQcm9wZXJ0aWVzKGRpc3Bvc2VkOiBzdHJpbmdbXSwgcHJvdmlkZXJLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucHJvdmlkZXIuY29udGV4dE1hcFtwcm92aWRlcktleV0gfHwgcHJvdmlkZXJLZXk7XG5cbiAgICBpZiAoZGlzcG9zZWQubGVuZ3RoICYmIGRpc3Bvc2VkLmluZGV4T2Yoa2V5KSA8IDApIHJldHVybjtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wcm92aWRlci5jb21wb25lbnRbcHJvdmlkZXJLZXldO1xuXG4gICAgdGhpcy52aWV3LmNvbnRleHQuJGltcGxpY2l0W2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLnZpZXcuY29udGV4dFtrZXldID0gdmFsdWU7XG4gICAgdGhpcy52aWV3Lm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLnByb3ZpZGVyICYmIHRoaXMudGVtcFJlZiAmJiB0aGlzLnZjUmVmKSB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuXG4gICAgaWYgKHRoaXMudmlldykgdGhpcy52Y1JlZi5jbGVhcigpO1xuICB9XG59XG4iXX0=