@ngneat/overview
Version:
The Template for Success in Template Management
77 lines • 11.1 kB
JavaScript
import { Directive, TemplateRef, ViewContainerRef, inject, input, } from '@angular/core';
import { isComponent, isString } from '../views/types';
import { ViewService } from '../views/view';
import { DynamicViewComponent } from './dynamic-view.component';
import * as i0 from "@angular/core";
export class DynamicViewDirective {
constructor() {
this.view = input(undefined, { alias: 'dynamicView' });
this.injector = input(undefined, { alias: 'dynamicViewInjector' });
this.context = input(undefined, { alias: 'dynamicViewContext' });
this.inputs = input(undefined, { alias: 'dynamicViewInputs' });
this.defaultTpl = inject(TemplateRef);
this.vcr = inject(ViewContainerRef);
this.viewService = inject(ViewService);
}
ngOnInit() {
this.resolveContentType();
}
ngOnChanges(changes) {
const viewChanged = changes.view && !changes.view.isFirstChange();
const contextChanged = changes.context && !changes.context.isFirstChange();
const inputsChanged = changes.inputs && !changes.inputs.isFirstChange();
if (viewChanged) {
this.resolveContentType();
}
else if (contextChanged) {
this.viewRef.updateContext(this.context());
}
else if (isComponent(this.view()) && inputsChanged) {
this.viewRef.setInputs(this.inputs() || {});
}
}
resolveContentType() {
this.viewRef?.destroy();
const view = this.view();
const injector = this.injector();
const context = this.context();
if (isString(view)) {
const viewRef = (this.viewRef = this.viewService.createComponent(DynamicViewComponent, {
vcr: this.vcr,
injector,
}));
viewRef.setInput('content', view).detectChanges();
}
else if (isComponent(view)) {
this.viewRef = this.viewService.createComponent(view, {
vcr: this.vcr,
injector: injector ?? this.vcr.injector,
context,
});
const inputs = this.inputs();
if (inputs) {
this.viewRef.setInputs(inputs);
}
}
else {
this.viewRef = this.viewService.createView(view || this.defaultTpl, {
vcr: this.vcr,
injector: injector ?? this.vcr.injector,
context,
});
}
}
ngOnDestroy() {
this.viewRef?.destroy();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DynamicViewDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.4", type: DynamicViewDirective, isStandalone: true, selector: "[dynamicView]", inputs: { view: { classPropertyName: "view", publicName: "dynamicView", isSignal: true, isRequired: false, transformFunction: null }, injector: { classPropertyName: "injector", publicName: "dynamicViewInjector", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "dynamicViewContext", isSignal: true, isRequired: false, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "dynamicViewInputs", isSignal: true, isRequired: false, transformFunction: null } }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DynamicViewDirective, decorators: [{
type: Directive,
args: [{
selector: '[dynamicView]',
standalone: true,
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy12aWV3LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nbmVhdC9vdmVydmlldy9zcmMvbGliL2R5bmFtaWMtdmlldy9keW5hbWljLXZpZXcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBTVQsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBVyxXQUFXLEVBQUUsUUFBUSxFQUFXLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFNaEUsTUFBTSxPQUFPLG9CQUFvQjtJQUpqQztRQUtXLFNBQUksR0FBRyxLQUFLLENBQVUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDM0QsYUFBUSxHQUFHLEtBQUssQ0FBVyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLFlBQU8sR0FBRyxLQUFLLENBQU0sU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUNqRSxXQUFNLEdBQUcsS0FBSyxDQUFtQixTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBRzdFLGVBQVUsR0FBcUIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELFFBQUcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztLQXlEM0M7SUF2REMsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0UsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFeEUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLE9BQXdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXhCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9CLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLG9CQUFvQixFQUFFO2dCQUNyRixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsUUFBUTthQUNULENBQUMsQ0FBQyxDQUFDO1lBRUosT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEQsQ0FBQzthQUFNLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixRQUFRLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUTtnQkFDdkMsT0FBTzthQUNSLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxPQUF3QixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQ3ZDLE9BQU87YUFDUixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7OEdBakVVLG9CQUFvQjtrR0FBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQUpoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEluamVjdG9yLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250ZW50LCBpc0NvbXBvbmVudCwgaXNTdHJpbmcsIFZpZXdSZWYgfSBmcm9tICcuLi92aWV3cy90eXBlcyc7XG5pbXBvcnQgeyBWaWV3U2VydmljZSB9IGZyb20gJy4uL3ZpZXdzL3ZpZXcnO1xuaW1wb3J0IHsgQ29tcFJlZiB9IGZyb20gJy4uL3ZpZXdzL2NvbXAtcmVmJztcbmltcG9ydCB7IER5bmFtaWNWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9keW5hbWljLXZpZXcuY29tcG9uZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2R5bmFtaWNWaWV3XScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNWaWV3RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IHZpZXcgPSBpbnB1dDxDb250ZW50Pih1bmRlZmluZWQsIHsgYWxpYXM6ICdkeW5hbWljVmlldycgfSk7XG4gIHJlYWRvbmx5IGluamVjdG9yID0gaW5wdXQ8SW5qZWN0b3I+KHVuZGVmaW5lZCwgeyBhbGlhczogJ2R5bmFtaWNWaWV3SW5qZWN0b3InIH0pO1xuICByZWFkb25seSBjb250ZXh0ID0gaW5wdXQ8YW55Pih1bmRlZmluZWQsIHsgYWxpYXM6ICdkeW5hbWljVmlld0NvbnRleHQnIH0pO1xuICByZWFkb25seSBpbnB1dHMgPSBpbnB1dDxSZWNvcmQ8YW55LCBhbnk+Pih1bmRlZmluZWQsIHsgYWxpYXM6ICdkeW5hbWljVmlld0lucHV0cycgfSk7XG5cbiAgcHJpdmF0ZSB2aWV3UmVmOiBWaWV3UmVmO1xuICBwcml2YXRlIGRlZmF1bHRUcGw6IFRlbXBsYXRlUmVmPGFueT4gPSBpbmplY3QoVGVtcGxhdGVSZWYpO1xuICBwcml2YXRlIHZjciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgcHJpdmF0ZSB2aWV3U2VydmljZSA9IGluamVjdChWaWV3U2VydmljZSk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZXNvbHZlQ29udGVudFR5cGUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCB2aWV3Q2hhbmdlZCA9IGNoYW5nZXMudmlldyAmJiAhY2hhbmdlcy52aWV3LmlzRmlyc3RDaGFuZ2UoKTtcbiAgICBjb25zdCBjb250ZXh0Q2hhbmdlZCA9IGNoYW5nZXMuY29udGV4dCAmJiAhY2hhbmdlcy5jb250ZXh0LmlzRmlyc3RDaGFuZ2UoKTtcbiAgICBjb25zdCBpbnB1dHNDaGFuZ2VkID0gY2hhbmdlcy5pbnB1dHMgJiYgIWNoYW5nZXMuaW5wdXRzLmlzRmlyc3RDaGFuZ2UoKTtcblxuICAgIGlmICh2aWV3Q2hhbmdlZCkge1xuICAgICAgdGhpcy5yZXNvbHZlQ29udGVudFR5cGUoKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRleHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZpZXdSZWYudXBkYXRlQ29udGV4dCh0aGlzLmNvbnRleHQoKSk7XG4gICAgfSBlbHNlIGlmIChpc0NvbXBvbmVudCh0aGlzLnZpZXcoKSkgJiYgaW5wdXRzQ2hhbmdlZCkge1xuICAgICAgKHRoaXMudmlld1JlZiBhcyBDb21wUmVmPGFueT4pLnNldElucHV0cyh0aGlzLmlucHV0cygpIHx8IHt9KTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlQ29udGVudFR5cGUoKSB7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3KCk7XG4gICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLmluamVjdG9yKCk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dCgpO1xuXG4gICAgaWYgKGlzU3RyaW5nKHZpZXcpKSB7XG4gICAgICBjb25zdCB2aWV3UmVmID0gKHRoaXMudmlld1JlZiA9IHRoaXMudmlld1NlcnZpY2UuY3JlYXRlQ29tcG9uZW50KER5bmFtaWNWaWV3Q29tcG9uZW50LCB7XG4gICAgICAgIHZjcjogdGhpcy52Y3IsXG4gICAgICAgIGluamVjdG9yLFxuICAgICAgfSkpO1xuXG4gICAgICB2aWV3UmVmLnNldElucHV0KCdjb250ZW50JywgdmlldykuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSBpZiAoaXNDb21wb25lbnQodmlldykpIHtcbiAgICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld1NlcnZpY2UuY3JlYXRlQ29tcG9uZW50KHZpZXcsIHtcbiAgICAgICAgdmNyOiB0aGlzLnZjcixcbiAgICAgICAgaW5qZWN0b3I6IGluamVjdG9yID8/IHRoaXMudmNyLmluamVjdG9yLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuaW5wdXRzKCk7XG4gICAgICBpZiAoaW5wdXRzKSB7XG4gICAgICAgICh0aGlzLnZpZXdSZWYgYXMgQ29tcFJlZjxhbnk+KS5zZXRJbnB1dHMoaW5wdXRzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3U2VydmljZS5jcmVhdGVWaWV3KHZpZXcgfHwgdGhpcy5kZWZhdWx0VHBsLCB7XG4gICAgICAgIHZjcjogdGhpcy52Y3IsXG4gICAgICAgIGluamVjdG9yOiBpbmplY3RvciA/PyB0aGlzLnZjci5pbmplY3RvcixcbiAgICAgICAgY29udGV4dCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudmlld1JlZj8uZGVzdHJveSgpO1xuICB9XG59XG4iXX0=