javascript - 在 Angular2 中使用动态组件时出现错误 "ERROR TypeError: Cannot read property ' createComponent' of undefined"

标签 javascript angular typescript

我正在尝试在 angular4 中动态添加组件。 我检查了其他问题,但我找不到解决方案。 我得到了错误

ERROR TypeError: Cannot read property 'createComponent' of undefined

关于动态组件。

adv.component.ts

import { Component, OnInit, AfterContentInit, ViewChild, ViewContainerRef, ComponentFactoryResolver } from '@angular/core';
import { SampleComponent } from '../sample/sample.component';
@Component({
  selector: 'app-adv',
  templateUrl: './adv.component.html',
  styleUrls: ['./adv.component.css']
})
export class AdvComponent implements OnInit, AfterContentInit {
  @ViewChild('container', {read:'ViewContainerRef'}) container;
  constructor(private resolver : ComponentFactoryResolver) { }

  ngOnInit() {
  }

  ngAfterContentInit(){
    const sampleFactory = this.resolver.resolveComponentFactory(SampleComponent);
    this.container.createComponent(sampleFactory);
  }

}

adv.component.html

<div #container></div>

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { AdvComponent } from './adv/adv.component';
import { SampleComponent } from './sample/sample.component';

@NgModule({
  declarations: [
    AppComponent,
    AdvComponent,
    SampleComponent
  ],
  entryComponents:[
    SampleComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

最佳答案

关于 ngAfterViewInit docs :

Respond after Angular initializes the component's views and child views.

ngAfterContentInit 时:

Respond after Angular projects external content into the component's view.

所以 subview 在ngAfterContentInit中还没有准备好,所以移动这部分

ngAfterContentInit(){
    const sampleFactory = this.resolver.resolveComponentFactory(SampleComponent);
    this.container.createComponent(sampleFactory);
  }

ngAfterViewInit() {
    const sampleFactory = this.resolver.resolveComponentFactory(SampleComponent);
    this.container.createComponent(sampleFactory);
}

同时改变:

  @ViewChild('container', {read:'ViewContainerRef'}) container;

@ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef 

关于javascript - 在 Angular2 中使用动态组件时出现错误 "ERROR TypeError: Cannot read property ' createComponent' of undefined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46115320/

相关文章:

javascript - 如何禁用/删除 ASP.NET TreeView 父节点上的单击事件?

php - 需要将数组值从 javascript 传递到 Codeigniter 中的 php Controller

javascript - 使用字符串作为 HTML

mysql - 如何仅通过对服务器的单个请求来存储一些数据并可以在多个页面上使用?

reactjs - 只有在使用 'IterableIterator<number>' 标志或使用 '--downlevelIteration' 或更高的 '--target' 时,才能迭代类型 'es2015'

javascript - 循环 json 时更改 key

angular - 后回调没有被调用

angular - 如何测试对输入字段中的 keydown 事件使用react的指令

reactjs - Typescript 中的 React 事件类型

typescript - 将 YouTube iframe API 与 Angular2 和 Typescript 一起使用