<!DOCTYPE html>
<html>
<head>
<base href="." />
<title>angular2 playground</title>
<link rel="stylesheet" href="style.css" />
<script src="https://unpkg.com/zone.js/dist/zone.js"></script>
<script src="https://unpkg.com/zone.js/dist/long-stack-trace-zone.js"></script>
<script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
<script src="https://unpkg.com/systemjs@0.19.31/dist/system.js"></script>
<script src="config.js"></script>
<script>
System.import('app')
.catch(console.error.bind(console));
</script>
</head>
<body>
<my-app>
loading...
</my-app>
</body>
</html>
/* Styles go here */
### Angular Starter Plunker - Typescript
System.config({
//use typescript for compilation
transpiler: 'typescript',
//typescript compiler options
typescriptOptions: {
emitDecoratorMetadata: true
},
paths: {
'npm:': 'https://unpkg.com/'
},
//map tells the System loader where to look for things
map: {
'app': './src',
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
'@angular/core/testing': 'npm:@angular/core/bundles/core-testing.umd.js',
'@angular/common/testing': 'npm:@angular/common/bundles/common-testing.umd.js',
'@angular/compiler/testing': 'npm:@angular/compiler/bundles/compiler-testing.umd.js',
'@angular/platform-browser/testing': 'npm:@angular/platform-browser/bundles/platform-browser-testing.umd.js',
'@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js',
'@angular/http/testing': 'npm:@angular/http/bundles/http-testing.umd.js',
'@angular/router/testing': 'npm:@angular/router/bundles/router-testing.umd.js',
'rxjs': 'npm:rxjs',
'typescript': 'npm:typescript@2.0.2/lib/typescript.js'
},
//packages defines our app package
packages: {
app: {
main: './main.ts',
defaultExtension: 'ts'
},
rxjs: {
defaultExtension: 'js'
}
}
});
//main entry point
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppModule} from './app';
platformBrowserDynamic().bootstrapModule(AppModule)
import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import HelloWorldComponent from './hello-world-component';
import WorldHelloComponent from './world-hello-component';
import DynamicComponent from './dynamic-component';
interface IPayload {
name: string;
email: string;
payload: {
id: number,
uuid: string
};
}
@Component({
selector: 'my-app',
template: `
<div>
<h2>Lets dynamically create some components!</h2>
<button (click)="createHelloWorldComponent()">Create Hello World</button>
<button (click)="createWorldHelloComponent()">Create World Hello</button>
<dynamic-component [componentData]="componentData"></dynamic-component>
</div>
`,
})
export class App {
componentData = null;
createHelloWorldComponent(){
let payload: IPayload {
name: 'NAME1',
email: 'l@l.l',
payload: {
id: 1,
uuid: '123456',
sub: {
message: 'other message'
}
}
}
this.componentData = {
component: HelloWorldComponent,
inputs: payload
};
}
createWorldHelloComponent(){
let payload: IPayload {
name: 'NAME2',
email: 'm@m.m',
payload: {
id: 2,
uuid: '654321',
sub: {
message: 'message'
}
}
}
this.componentData = {
component: WorldHelloComponent,
inputs: payload
};
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, HelloWorldComponent, WorldHelloComponent, DynamicComponent],
bootstrap: [ App ]
})
export class AppModule {}
import {Component, Injector} from '@angular/core';
@Component({
selector: 'hello-world',
template: `
<div>{{ payload.id }}<br>HW<br>{{name}}</div>
<p>{{ payload.sub.message }}</p>
`,
})
export default class HelloWorldComponent {
name ='';
id:'';
email = '';
payload = {};
constructor(private injector: Injector) {
this.name = this.injector.get('name');
this.payload = this.injector.get('payload');
console.log('payload: ' + this.payload);
console.log(this.payload);
}
}
import {Component, Injector} from '@angular/core';
@Component({
selector: 'world-hello',
template: `
<div>{{ payload.id }}<br>WH<br>{{name}}</div>
<p>{{ payload.sub.message }}</p>
`,
})
export default class WorldHelloComponent {
name ='';
email = '';
payload = {};
constructor(private injector: Injector) {
this.name = this.injector.get('name');
this.payload = this.injector.get('payload');
console.log('payload: ' + this.payload);
console.log(this.payload);
}
}
import {Component, Input, ViewContainerRef, ViewChild, ReflectiveInjector, ComponentFactoryResolver} from '@angular/core';
import HelloWorldComponent from './hello-world-component';
import WorldHelloComponent from './world-hello-component';
@Component({
selector: 'dynamic-component',
entryComponents: [HelloWorldComponent, WorldHelloComponent], // Reference to the components must be here in order to dynamically create them
template: `
<div #dynamicComponentContainer></div>
`,
})
export default class DynamicComponent {
currentComponent = null;
@ViewChild('dynamicComponentContainer', { read: ViewContainerRef }) dynamicComponentContainer: ViewContainerRef;
// component: Class for the component you want to create
// inputs: An object with key/value pairs mapped to input name/input value
@Input() set componentData(data: {component: any, inputs: any }) {
if (!data) {
return;
}
// Inputs need to be in the following format to be resolved properly
let inputProviders = Object.keys(data.inputs).map((inputName) => {
return {
provide: inputName,
useValue: data.inputs[inputName]
};
});
console.log(inputProviders);
let resolvedInputs = ReflectiveInjector.resolve(inputProviders);
// We create an injector out of the data we want to pass down and this components injector
let injector = ReflectiveInjector.fromResolvedProviders(resolvedInputs, this.dynamicComponentContainer.parentInjector);
// We create a factory out of the component we want to create
let factory = this.resolver.resolveComponentFactory(data.component);
// We create the component using the factory and the injector
let component = factory.create(injector);
//console.log("injector",inputProviders, resolvedInputs, factory, component);
// We insert the component into the dom container
let tempViewRef = this.dynamicComponentContainer.insert(component.hostView);
let tempViewRefIndex = this.dynamicComponentContainer.indexOf(tempViewRef);
// console.log(this.dynamicComponentContainer.get(tempViewRefIndex));
console.log('**showNum Provider',this.dynamicComponentContainer);
// Destroy the previously created component
if(this.currentComponent){
//this.currentComponent.destroy();
}
this.currentComponent = component;
}
constructor(private resolver: ComponentFactoryResolver) {
}
}