I have two angular application say A and B. Now in B application's One tab i want to load entire application A. How do i achieve this?
Please let me know how to achieve this functionality. Does angular has any special tag which i can use
One solution to your problem might be to create the tag you are asking for yourself. I implemented Angular application A in Angular application B by a technique named web component or Angular elements as stated above, see e.g. https://www.techiediaries.com/angular/angular-9-elements-web-components/
In the following steps a tag shiny-app-a is defined in application A which is used later on in application B by importing the JavaScript files of A into B and referencing them by the tag.
It works in the following environment:
The steps to make it run are:
This application additionally needs the package @angular/elements.
$ ng new App-A
$ cd App-A
$ ng add @angular/elements
My app.modules.ts looks like this:
import { BrowserModule } from '@angular/platform-browser';
// import Injector
import { Injector, NgModule } from '@angular/core';
// import createCustomElement
import { createCustomElement } from '@angular/elements';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {
constructor(private injector: Injector){}
ngDoBootstrap(){
const el = createCustomElement(AppComponent, {injector:this.injector});
// Here you define your new tag shiny-app-a
customElements.define('shiny-app-a', el);
}
}
$ ng build --prod --output-hashing none
This generates among others the files:
You will find them in the folder [...]\App-A\dist\App-A
Run
$ ng serve
and see in the browser your newly built application A.
Note: no @angular/elements is needed here.
$ ng new App-B
In this example I use the folder [...]/src/assets.
$ cd App-B/src/assets/
and copy the JavaScript from application A to this folder, i.e.:
The crucial item to implement is CUSTOM_ELEMENTS_SCHEMA. My app.modules.ts of application B looks like this:
import { BrowserModule } from '@angular/platform-browser';
// import CUSTOM_ELEMENTS_SCHEMA
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
// add schemas
schemas: [CUSTOM_ELEMENTS_SCHEMA],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
2.3.2 Load JavaScript from external source in app.component.ts
The JavaScript files may also be loaded from any source. In this case the files are loaded by OnInit() from the [...]/assets folder. Thus my app.component.ts of application B looks like this:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'App-B';
ngOnInit() {
this.loadScript('/assets/runtime.js');
this.loadScript('/assets/main.js');
this.loadScript('/assets/polyfills.js');
}
public loadScript(url: string) {
const body = <HTMLDivElement> document.body;
const script = document.createElement('script');
script.innerHTML = '';
script.src = url;
script.async = false;
script.defer = true;
body.appendChild(script);
}
}
2.3.3 Use tag in app.component.html
Replace anything from the file app.component.html and just by:
<shiny-app-a></shiny-app-a>
Run
$ ng serve
and see in the browser application A in application B.
Cannot find app-root element. I tried using a prefix and even changing the app root element from my main project but always the same... :/You want something like MICRO front ends, build Application A as Angular custom element (web component - Angular Elements), the output will be a script. Load this script in Application B. place the selector which you provided while creating a custom element in Micro App B where ever you want to load App A.
For More read about Micro Front Ends (Angular Elements)
Please don't use iframe they become really difficult to manage, To know more read a little about Micro Front End with Angular there are lots of well-written blogs on the same.