angular-traversal
Version:
A traversal navigation library for Angular (v2+)
52 lines • 6.87 kB
JavaScript
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==