UNPKG

angular-traversal

Version:
52 lines 6.87 kB
import { Directive, ViewContainerRef, ChangeDetectorRef, } from '@angular/core'; import { Location } from '@angular/common'; import { Traverser } from './traverser'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; export class TraverserOutlet { constructor(traverser, location, container, cdr) { this.traverser = traverser; this.location = location; this.container = container; this.cdr = cdr; this.terminator = new Subject(); } ngOnInit() { this.traverser.target.pipe(takeUntil(this.terminator)).subscribe((target) => this.render(target)); this.traverser.traverse(this.location.path().replace(this.traverser.getPrefix(), ''), false); this.location.subscribe((loc) => { const path = (loc.url || '').replace(this.traverser.getPrefix(), ''); this.traverser.traverse(path || '/', false); // when empty string traverse to root }); } ngOnDestroy() { if (this.viewInstance) { this.viewInstance.destroy(); } this.terminator.next(); } render(target) { if (this.viewInstance) { this.viewInstance.destroy(); } if (target.component) { const componentFactory = this.traverser.getComponent(target.component); this.viewInstance = this.container.createComponent(componentFactory); } if (!this.cdr.destroyed) { this.cdr.detectChanges(); } } } TraverserOutlet.decorators = [ { type: Directive, args: [{ selector: 'traverser-outlet', },] } ]; TraverserOutlet.ctorParameters = () => [ { type: Traverser }, { type: Location }, { type: ViewContainerRef }, { type: ChangeDetectorRef } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhdmVyc2VyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RyYXZlcnNhbC9zcmMvbGliL3RyYXZlcnNlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFHVCxnQkFBZ0IsRUFJaEIsaUJBQWlCLEdBRXBCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGFBQWEsQ0FBQztBQUUzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBbUIsTUFBTSxNQUFNLENBQUM7QUFLaEQsTUFBTSxPQUFPLGVBQWU7SUFJeEIsWUFDWSxTQUFvQixFQUNwQixRQUFrQixFQUNsQixTQUEyQixFQUMzQixHQUFzQjtRQUh0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFOMUIsZUFBVSxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBTy9DLENBQUM7SUFFSixRQUFRO1FBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7UUFDdEYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQWM7UUFDakIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDL0I7UUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsSUFBSSxDQUFFLElBQUksQ0FBQyxHQUFlLENBQUMsU0FBUyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDNUI7SUFDTCxDQUFDOzs7WUF6Q0osU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0I7OztZQVBRLFNBQVM7WUFEVCxRQUFRO1lBUGIsZ0JBQWdCO1lBSWhCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBJbmplY3QsXG4gICAgT3B0aW9uYWwsXG4gICAgSW5wdXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgVmlld1JlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUcmF2ZXJzZXIsIE5BVklHQVRJT05fUFJFRklYIH0gZnJvbSAnLi90cmF2ZXJzZXInO1xuaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ3RyYXZlcnNlci1vdXRsZXQnLFxufSlcbmV4cG9ydCBjbGFzcyBUcmF2ZXJzZXJPdXRsZXQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSB2aWV3SW5zdGFuY2U6IGFueTtcbiAgICBwcml2YXRlIHRlcm1pbmF0b3I6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdHJhdmVyc2VyOiBUcmF2ZXJzZXIsXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICBwcml2YXRlIGNvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudHJhdmVyc2VyLnRhcmdldC5waXBlKHRha2VVbnRpbCh0aGlzLnRlcm1pbmF0b3IpKS5zdWJzY3JpYmUoKHRhcmdldDogVGFyZ2V0KSA9PiB0aGlzLnJlbmRlcih0YXJnZXQpKTtcbiAgICAgICAgdGhpcy50cmF2ZXJzZXIudHJhdmVyc2UodGhpcy5sb2NhdGlvbi5wYXRoKCkucmVwbGFjZSh0aGlzLnRyYXZlcnNlci5nZXRQcmVmaXgoKSwgJycpLCBmYWxzZSk7XG4gICAgICAgIHRoaXMubG9jYXRpb24uc3Vic2NyaWJlKChsb2MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSAobG9jLnVybCB8fCAnJykucmVwbGFjZSh0aGlzLnRyYXZlcnNlci5nZXRQcmVmaXgoKSwgJycpO1xuICAgICAgICAgICAgdGhpcy50cmF2ZXJzZXIudHJhdmVyc2UocGF0aCB8fCAnLycsIGZhbHNlKTsgLy8gd2hlbiBlbXB0eSBzdHJpbmcgdHJhdmVyc2UgdG8gcm9vdFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld0luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXJtaW5hdG9yLm5leHQoKTtcbiAgICB9XG5cbiAgICByZW5kZXIodGFyZ2V0OiBUYXJnZXQpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld0luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldC5jb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLnRyYXZlcnNlci5nZXRDb21wb25lbnQodGFyZ2V0LmNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdJbnN0YW5jZSA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh0aGlzLmNkciBhcyBWaWV3UmVmKS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==