Allow NgComponentOutlet to dynamically load a module, then load a component from that module. Useful for lazy loading code, then add the lazy loaded code to the page using NgComponentOutlet. Closes #14043
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright Google Inc. All Rights Reserved.
 | 
						|
 *
 | 
						|
 * Use of this source code is governed by an MIT-style license that can be
 | 
						|
 * found in the LICENSE file at https://angular.io/license
 | 
						|
 */
 | 
						|
 | 
						|
import {CommonModule} from '@angular/common';
 | 
						|
import {Compiler, Component, Injectable, Injector, NgModule, NgModuleFactory, ReflectiveInjector} from '@angular/core';
 | 
						|
import {BrowserModule} from '@angular/platform-browser';
 | 
						|
 | 
						|
 | 
						|
 | 
						|
// #docregion SimpleExample
 | 
						|
@Component({selector: 'hello-world', template: 'Hello World!'})
 | 
						|
class HelloWorld {
 | 
						|
}
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'ng-component-outlet-simple-example',
 | 
						|
  template: `<ng-container *ngComponentOutlet="HelloWorld"></ng-container>`
 | 
						|
})
 | 
						|
class NgTemplateOutletSimpleExample {
 | 
						|
  // This field is necessary to expose HelloWorld to the template.
 | 
						|
  HelloWorld = HelloWorld;
 | 
						|
}
 | 
						|
// #enddocregion
 | 
						|
 | 
						|
// #docregion CompleteExample
 | 
						|
@Injectable()
 | 
						|
class Greeter {
 | 
						|
  suffix = '!';
 | 
						|
}
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'complete-component',
 | 
						|
  template: `Complete: <ng-content></ng-content> <ng-content></ng-content>{{ greeter.suffix }}`
 | 
						|
})
 | 
						|
class CompleteComponent {
 | 
						|
  constructor(public greeter: Greeter) {}
 | 
						|
}
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'ng-component-outlet-complete-example',
 | 
						|
  template: `
 | 
						|
    <ng-container *ngComponentOutlet="CompleteComponent; 
 | 
						|
                                      injector: myInjector; 
 | 
						|
                                      content: myContent"></ng-container>`
 | 
						|
})
 | 
						|
class NgTemplateOutletCompleteExample {
 | 
						|
  // This field is necessary to expose CompleteComponent to the template.
 | 
						|
  CompleteComponent = CompleteComponent;
 | 
						|
  myInjector: Injector;
 | 
						|
 | 
						|
  myContent = [[document.createTextNode('Ahoj')], [document.createTextNode('Svet')]];
 | 
						|
 | 
						|
  constructor(injector: Injector) {
 | 
						|
    this.myInjector = ReflectiveInjector.resolveAndCreate([Greeter], injector);
 | 
						|
  }
 | 
						|
}
 | 
						|
// #enddocregion
 | 
						|
 | 
						|
// #docregion NgModuleFactoryExample
 | 
						|
@Component({selector: 'other-module-component', template: `Other Module Component!`})
 | 
						|
class OtherModuleComponent {
 | 
						|
}
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'ng-component-outlet-other-module-example',
 | 
						|
  template: `
 | 
						|
    <ng-container *ngComponentOutlet="OtherModuleComponent;
 | 
						|
                                      ngModuleFactory: myModule;"></ng-container>`
 | 
						|
})
 | 
						|
class NgTemplateOutletOtherModuleExample {
 | 
						|
  // This field is necessary to expose OtherModuleComponent to the template.
 | 
						|
  OtherModuleComponent = OtherModuleComponent;
 | 
						|
  myModule: NgModuleFactory<any>;
 | 
						|
 | 
						|
  constructor(compiler: Compiler) { this.myModule = compiler.compileModuleSync(OtherModule); }
 | 
						|
}
 | 
						|
// #enddocregion
 | 
						|
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'example-app',
 | 
						|
  template: `<ng-component-outlet-simple-example></ng-component-outlet-simple-example>
 | 
						|
             <hr/>
 | 
						|
             <ng-component-outlet-complete-example></ng-component-outlet-complete-example>
 | 
						|
             <hr/>
 | 
						|
             <ng-component-outlet-other-module-example></ng-component-outlet-other-module-example>`
 | 
						|
})
 | 
						|
class ExampleApp {
 | 
						|
}
 | 
						|
 | 
						|
@NgModule({
 | 
						|
  imports: [BrowserModule],
 | 
						|
  declarations: [
 | 
						|
    ExampleApp, NgTemplateOutletSimpleExample, NgTemplateOutletCompleteExample,
 | 
						|
    NgTemplateOutletOtherModuleExample, HelloWorld, CompleteComponent
 | 
						|
  ],
 | 
						|
  entryComponents: [HelloWorld, CompleteComponent],
 | 
						|
  bootstrap: [ExampleApp]
 | 
						|
})
 | 
						|
export class AppModule {
 | 
						|
}
 | 
						|
 | 
						|
@NgModule({
 | 
						|
  imports: [CommonModule],
 | 
						|
  declarations: [OtherModuleComponent],
 | 
						|
  entryComponents: [OtherModuleComponent]
 | 
						|
})
 | 
						|
export class OtherModule {
 | 
						|
} |