angular - 是否可以在 Angular 2 中手动实例化组件

标签 angular angular2-components

在angular 2中,是否可以手动实例化一个组件A,然后将其传递并在组件B的模板中渲染?

最佳答案

是的,这是受支持的。您需要一个 ViewComponentRef,例如可以通过将其注入(inject)构造函数或使用 @ViewChild('targetname') 查询和 ComponentResolver 也可以注入(inject)。

此代码示例来自 https://stackoverflow.com/a/36325468/217408例如允许使用 *ngFor

动态添加组件
@Component({
  selector: 'dcl-wrapper',
  template: `<div #target></div>`
})
export class DclWrapper {
  @ViewChild('target', {read: ViewContainerRef}) target;
  @Input() type;
  cmpRef:ComponentRef;
  private isViewInitialized:boolean = false;

  constructor(private resolver: ComponentResolver) {}

  updateComponent() {
    if(!this.isViewInitialized) {
      return;
    }
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }
   this.resolver.resolveComponent(this.type).then((factory:ComponentFactory<any>) => {
      this.cmpRef = this.target.createComponent(factory)
    });
  }

  ngOnChanges() {
    this.updateComponent();
  }

  ngAfterViewInit() {
    this.isViewInitialized = true;
    this.updateComponent();  
  }

  ngOnDestroy() {
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }    
  }
}

关于angular - 是否可以在 Angular 2 中手动实例化组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37063455/

相关文章:

angular - map 上方的 Bootstrap Angular Leaflet Div

angular - 在 Angular 单个组件中导入第 3 方 javascript 库

javascript - 如何获取 Angular 2中的第一个父scrollTop元素?

angular - 如何将组件导入 Angular 2 中的另一个根组件

javascript - 如何将普通js函数注册到 Angular 中的@Output

javascript - 将多个模块包装在单个模块 Angular 2 中?

angular2-template - Angular 2 扩展组件 - 如何继承样式

javascript - 如何将获取的API的一部分添加到组件定义的数组中

angular - Angular2 是否有等同于 $document

javascript - 如何以 Angular 启用提交按钮