Skip to content

Commit

Permalink
feat: add lazy loading of components
Browse files Browse the repository at this point in the history
  • Loading branch information
brandonroberts committed Jun 17, 2020
1 parent 8cf5f73 commit c9d3e35
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 31 deletions.
64 changes: 38 additions & 26 deletions projects/router/src/lib/route.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ import {
OnInit,
Input,
Type,
ɵrenderComponent as renderComponent,
ɵmarkDirty as markDirty,
ɵcreateInjector as createInjector,
ViewContainerRef,
ComponentFactoryResolver,
ContentChild,
Expand Down Expand Up @@ -55,7 +52,7 @@ export class RouteComponent implements OnInit {
@Input() loadComponent: LoadComponent;
@Input() reuse = true;
@Input() redirectTo!: string;
// rendered = null;

private destroy$ = new Subject();
private _routeParams$ = new BehaviorSubject<Params>({});
private _shouldRender$ = new BehaviorSubject<boolean>(false);
Expand All @@ -65,9 +62,10 @@ export class RouteComponent implements OnInit {
route!: Route;

constructor(
// private injector: Injector,
private router: Router,
private routerComponent: RouterComponent
private routerComponent: RouterComponent,
private resolver: ComponentFactoryResolver,
private viewContainerRef: ViewContainerRef
) {}

ngOnInit(): void {
Expand All @@ -78,8 +76,7 @@ export class RouteComponent implements OnInit {

this.route = this.routerComponent.registerRoute({
path,
// component: this.component,
// loadComponent: this.loadComponent,
loadComponent: this.loadComponent,
});

const activeRoute$ = this.routerComponent.activeRoute$.pipe(
Expand All @@ -100,7 +97,7 @@ export class RouteComponent implements OnInit {
this.clearView();
}

return this.loadAndRenderRoute(current.route);
return this.loadAndRender(current.route);
}
} else if (rendered) {
return of(this.clearView());
Expand All @@ -110,37 +107,52 @@ export class RouteComponent implements OnInit {
})
);

// const routeParams$ = this._routeParams$
// .pipe(
// distinctUntilChanged(),
// filter(() => !!this.rendered),
// tap(() => markDirty(this.rendered))
// );

merge(activeRoute$).pipe(takeUntil(this.destroy$)).subscribe();
}

ngOnDestroy() {
this.destroy$.next();
}

private loadAndRenderRoute(route: Route) {
// if (route.loadComponent) {
// return route.loadComponent().then((component) => {
// return this.renderView(component);
// });
// } else {
return of(this.renderView());
// }
private loadAndRender(route: Route) {
if (route.loadComponent) {
return route.loadComponent().then((component) => {
return this.renderComponent(component);
});
} else {
return of(this.showTemplate());
}
}

private renderComponent(component: Type<any>) {
const componentFactory = this.resolver.resolveComponentFactory(component);

this.showTemplate();
this.viewContainerRef.createComponent(componentFactory, this.viewContainerRef.length, this.viewContainerRef.injector);

return of(true);
}

private renderView() {
private clearComponent() {
this.viewContainerRef.clear();
this.hideTemplate();
}

private showTemplate() {
setTimeout(() => {
this._shouldRender$.next(true);
});
}

private clearView() {
private hideTemplate() {
this._shouldRender$.next(false);
}

private clearView() {
if (this.loadComponent) {
this.clearComponent();
} else {
this.hideTemplate();
}
}
}
2 changes: 1 addition & 1 deletion projects/router/src/lib/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export type LoadComponent = () => Promise<Type<any>>;
export interface Route {
path: string;
// component?: Type<any>;
// loadComponent?: LoadComponent;
loadComponent?: LoadComponent;
matcher?: RegExp;
}

Expand Down
9 changes: 5 additions & 4 deletions src/app/core/components/layout/layout.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import { FooterComponentModule } from '../../../shared/footer/footer.component';

import { PageComponentModule } from '../page/page.component';
import { RedirectComponent } from '../redirect/redirect.component';
import { BlogComponentModule } from '../../../blog/blog/blog.component';
import { PageNotFoundComponentModule } from '../page-not-found/page-not-found.component';

@Component({
Expand Down Expand Up @@ -83,8 +82,7 @@ import { PageNotFoundComponentModule } from '../page-not-found/page-not-found.co
<div class="content" [class.container]="!(isHandset$ | async)">
<router>
<route path="/blog/**">
<app-blog *routeComponent></app-blog>
<route path="/blog/**" [loadComponent]="components.blog">
</route>
<route path="/404">
<app-page-not-found *routeComponent></app-page-not-found>
Expand Down Expand Up @@ -159,6 +157,10 @@ import { PageNotFoundComponentModule } from '../page-not-found/page-not-found.co
],
})
export class LayoutComponent {
components = {
blog: () => import('../../../blog/blog/blog.component').then(m => m.BlogComponent)
};

isHandset$: Observable<boolean> = this.breakpointObserver
.observe(Breakpoints.Handset)
.pipe(map((result) => result.matches));
Expand All @@ -177,7 +179,6 @@ export class LayoutComponent {
MatSidenavModule,
MatIconModule,
MatListModule,
BlogComponentModule,
PageComponentModule,
PageNotFoundComponentModule,
FooterComponentModule,
Expand Down

0 comments on commit c9d3e35

Please sign in to comment.