20. August 2019
Working with Projects

TL;DR
Create base application
Main ideas comes from here: Combining Multiple Angular Applications into a Single One
Generate base app and workspace
Each Sub-Application consists of 2 Views (Pages) and a common navigation bar.
As a result, we will get the following directory structure:
Create additional apps
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="shell" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">$ ng generate application --routing app1 --style scss
$ ng generate application --routing app2 --style scss
Generate a component
For each application, we create the 3 components: View 1, View 2 and a NavBar.
- The parameter
--project
defines the application, where we will add the component. - The Parameter
--module
defines the application module class, where we add the definition the the newly creates components, in this caseapp#/src/app/app.modules.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">ng generate component components/view1 --project=app1 --module=app.module.ts
ng generate component components/view2 --project=app1 --module=app.module.ts
ng generate component components/nav --project=app1 --module=app.module.ts
ng generate component components/view1 --project=app2 --module=app.module.ts
ng generate component components/view2 --project=app2 --module=app.module.ts
ng generate component components/nav --project=app2 --module=app.module.ts
ng generate component components/nav
Customize Components: Main App
Edit src/app/app.module.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { App1SharedModule } from 'projects/app1/src/app/app.shared.module';
import { App2SharedModule } from 'projects/app2/src/app/app.shared.module';
import { NavComponent } from './components/nav/nav.component';
@NgModule({
declarations: [AppComponent, NavComponent],
imports: [
BrowserModule,
AppRoutingModule,
App1SharedModule.forRoot(),
App2SharedModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
Edit src/app/app-routing.module.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { App1SharedModule } from 'projects/app1/src/app/app.shared.module';
import { App2SharedModule } from 'projects/app2/src/app/app.shared.module';
const routes: Routes = [
{ path: 'app1', component: App1SharedModule },
{ path: 'app2', component: App2SharedModule },
{ path: '**', redirectTo: 'app1/view1' }
];
@NgModule({
imports: [
RouterModule.forRoot(routes),
App1SharedModule.forRoot(),
App2SharedModule.forRoot()
],
exports: [RouterModule]
})
export class AppRoutingModule {}
Edit src/app/app.component.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">export class AppComponent {
title = 'base-app';
}
Replace src/app/app.component.html
- the header part with the welcome text, an image and the navigation bar to the 2 apps
- the application part, depending of the selected application
Replace src/app/components/nav/nav.component.html
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title=""><div style="text-align:center">
<a routerLink="/app1">App 1</a> | <a routerLink="/app2">App 2</a>
</div>
Customize Components: App1
Edit projects/app1/src/app/app.module.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">import { View1Component } from './components/view1/view1.component';
import { View2Component } from './components/view2/view2.component';
import { NavComponent } from './components/nav/nav.component';
@NgModule({
declarations: [AppComponent, View1Component, View2Component, NavComponent],
...
Edit projects/app1/src/app/app-routing.module.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">import { View1Component } from './components/view1/view1.component';
import { View2Component } from './components/view2/view2.component';
const routes: Routes = [
{ path: 'app1/view1', component: View1Component },
{ path: 'app1/view2', component: View2Component },
{ path: 'app1', redirectTo: 'app1/view1' }
];
Create projects/app1/src/app/app.shared.module.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">import { NgModule, ModuleWithProviders } from '@angular/core';
import { AppModule } from './app.module';
const providers = [];
@NgModule({})
export class App1SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: AppModule,
providers
};
}
}
Replace projects/app1/src/app/app.component.html
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title=""><router-outlet></router-outlet>
Replace projects/app1/src/app/components/nav/nav.component.html
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title=""><a routerLink="/app1/view1">View 1</a> | <a routerLink="/app1/view2">View 2</a>
Add to projects/app1/src/app/components/view2/view2.component.ts
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="2" data-enlighter-language="js" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title="">export class View1Component implements OnInit {
title = 'App1: View 1';
...
Replace projects/app1/src/app/components/view1/view1.component.html
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="html" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title=""><app-nav></app-nav>
<p>{{ title }}</p>
Replace projects/app1/src/app/components/view2/view2.component.html
<pre class="EnlighterJSRAW" data-enlighter-group="" data-enlighter-highlight="" data-enlighter-language="generic" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-theme="" data-enlighter-title=""><app-nav></app-nav>
<p>{{ title }}</p>
Customize Components: App2
Do the same as for App1, but replace every App1
with App2
and every app1
with app2