Angular 2 Dynamically insert a component into a specific DOM node without using ViewContainerRef

后端 未结 2 1888
长情又很酷
长情又很酷 2020-11-29 06:58

I have a question regarding dynamic component creation in Angular 2 rc5.

So let\'s assume that we have two plain angular components:

  @Component({
          


        
2条回答
  •  有刺的猬
    2020-11-29 07:37

    When creating a component you can pass the DOM node that will act as a host element of the created component:

    create(injector: Injector, projectableNodes?: any[][], rootSelectorOrNode?: string|any, ngModule?: NgModuleRef): ComponentRef

    But since this component is not child of any other component, you have to manually attach it to ApplicationRef so you get change detection.

    So here is what you need to do:

    1) Create a component specifying the root node under which it should be added.
    2) Attach the view to the ApplicationRef so that you get change detection. You will still have no Input and ngOnChanges operations, but the DOM update will be working fine.

      @Component({
          template: `
            

    My Component

    `, selector: 'my-app' }) export class AppComponent { constructor(private resolver: ComponentFactoryResolver, private injector: Injector, private app: ApplicationRef) { } addDynamicComponent() { let factory = this.resolver.resolveComponentFactory(SimpleComponent); let newNode = document.createElement('div'); newNode.id = 'placeholder'; document.getElementById('container').appendChild(newNode); const ref = factory.create(this.injector, [], newNode); this.app.attachView(ref.hostView); } }

提交回复
热议问题