Skip to main content

Angular 2: Multiple instances in the same Application

Requirement: 

  • Use multiple Root-Components in the same Application 
  • This Root-Components use the same Implementations and Services
  • Display the Root-Components on the same Single-Page

Solution:

App-Module preparation:
 import { BrowserModule, DOCUMENT } from '@angular/platform-browser';  
 import { NgModule, Inject, Component } from '@angular/core';  
 export class AppModule {  
 private browser_document;  
  ngDoBootstrap(appRef){  
   if(this.browser_document.getElementsByTagName('app-root1').length > 0){appRef.bootstrap(AppComponent1);}  
   if(this.browser_document.getElementsByTagName('app-root2').length > 0){appRef.bootstrap(AppComponent2);}  
  }  
  constructor(@Inject(DOCUMENT) private document: any){  
   this.browser_document = document;  
  }  
 }  
Service preparation:
Angular 2 has two options to provide a service.
1. Single instance
For a multiple implementation of more Root-Components we need the second option.
2. Multiple instance
Bootstrap: 
Replace the bootstrap declaration with:
 entryComponents: [  
   AppComponent1,   
   AppComponent2
 ]  
Index.html:
 <html>  
 <head>  
  <title>TestApplication</title>  
  <base href="/">  
  <meta name="viewport" content="width=device-width, initial-scale=1">  
  <link rel="icon" type="image/x-icon" href="favicon.ico">  
 </head>  
 <body>  
       <app-root1>Loading...</app-root1>  
       <app-root2> Loading...</app-root2>  
 </body>  
 </html>  

In cooperation with Ludwig Fischer

Comments

Popular posts from this blog

Download a file with Angular2+ and FileSaver.js

Why should your Angular code download a file? Of course your webserver can deliver files and you can just add a simple link to your website but what if the file is delivered by a webservice and the webservice requests authentication (i.e. OAuth) to protect the file from unauthorized access? In this case you might have the requirement to download the file in your code and then tell the browser to save it to the hard disk. How to do that?   First of all you need to add filesaver.js to your project.  npm install file-saver --save ..and add the typings npm install @types/file-saver --save-dev More information about filesaver you can find on the filesaver github pages . To download the file via http you need to implement a service. The following imports are required: import  {  Injectable  }  from   '@angular/core' ; import  {  Http ,  Response ,  RequestOptions ,  ResponseContentType  }  from   ...

Typescript: json2ts is a nice helper

Writing interfaces can be annoying. You can save a lot of time when you have to define Typescript interfaces for data that you are loading from a webservice.  Instead of typing all the interfaces yourself you can just use a nice service in the web: json2ts Just paste in your json code and it generates the corresponding interfaces in Typescripts. Example JSON: [   {      "city": "Berlin",     "country": "Germany",     "currencies": [{"code":"EUR"}]   },   {      "city": "Paris",     "country": "France",     "currencies": [{"code":"EUR"}]   } ] Generated code: declare module namespace {     export interface Currency {         code: string;     }     export interface RootObject {         city: string;         country: string;         currencies: Currency...

Nested Component - Passing Data to a Child Component

If you want to pass data to a nested component you have to use the @Import decorator. You can find this decorator at @angular/core import  {  Input  }  from   '@angular/core' ; Now I show you how you can use this decorator. In my example I want to pass a counter from a Shopping List to a Shopping Basket Component In the end, the shopping basket should look like this: The Shopping Basket shows the number of items in an array (Shopping List). Everytime we put an item in the basket we count the items in the array this . counter  =  this . selectedProducts . length Now we have to pass the counter to the ShoppingBasketComponent by using property binding < app-shopping-basket  [ count ]= "counter" ></ app-shopping-basket > After this we can use the input decorator at the child component export   class   ShoppingBasketComponent   implements   OnInit  { @ Input ()  count ...