Angular2动态添加的元素

棕色的

我正在尝试使用@GünterZöchbauer提供的动态组件,这里Angular 2动态选项卡与用户单击所选组件来创建行和列。到目前为止,我已经成功添加了行,但是仍然无法在行内创建列。

这是我的代码:

设计器模块

import { NgModule }      from '@angular/core';
import { CommonModule } from '@angular/common';

import { MaterializeModule } from '../../shared/materialize/materialize.module';

import { DesignerComponent } from './designer.component';

import { RowComponent } from './designer.component';
import { ColumnComponent } from './designer.component';

import { DynWrapperComponent } from './dyn-wrapper.component';


@NgModule({
  imports: [
    CommonModule,
    MaterializeModule,
  ],
  declarations: [
    DesignerComponent,
    DynWrapperComponent,
    RowComponent,
    ColumnComponent,
  ],
  entryComponents: [
    RowComponent,
    ColumnComponent,
  ],
  providers: [

  ]
})

export class DesignerModule {}

DynWrapperComponent

import { Component, Compiler, ViewContainerRef, ViewChild, Input, ElementRef,
         ComponentRef, ComponentFactory, ComponentFactoryResolver} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

// Helper component to add dynamic components
@Component({
  moduleId: module.id,
  selector: 'dcl-wrapper',
  template: `<div #target></div>`
})
export class DynWrapperComponent {
  @ViewChild('target', {read: ViewContainerRef}) target: any;
  @Input() type: any;
  cmpRef:ComponentRef<any>;
  private isViewInitialized:boolean = false;

  constructor(private componentFactoryResolver: ComponentFactoryResolver,
              private compiler: Compiler,
              private el: ElementRef) {}

  updateComponent() {
    if(!this.isViewInitialized) {
      return;
    }
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }

    let factory = this.componentFactoryResolver.resolveComponentFactory(this.type);

    //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();
    }
  }
}

设计器组件

import { Component, ViewChild, ElementRef, ContentChildren } from '@angular/core';


@Component({
  moduleId: module.id,
  selector: 'my-row',
  templateUrl: 'row.component.html',
  styles: [
    `.row:hover {
        border: 3px dashed #880e4f ;
      }
    `
  ]
})

export class RowComponent {

  colIndex: number = 0;
  colList: Object[] = [];

  addColumn() {
    this.colList.splice(this.colIndex, 0, ColumnComponent);
    this.colIndex++;
  }

  removeColumn(colIdx: number) {
    this.colList.splice(colIdx, 1);
  }
}

@Component({
  moduleId: module.id,
  selector: 'my-column',
  templateUrl: 'column.component.html',
  styles: [
    `.col:hover {
        border: 3px solid  #304ffe;
      }
    `
  ]
})

export class ColumnComponent {

}

@Component({
  moduleId: module.id,
  selector: 'my-designer',
  templateUrl: 'designer.component.html',
})

export class DesignerComponent {
  @ViewChild('builder') builder:ElementRef;

  elementIndex: number = 0;

  list: Object[] = [];


   ngAfterViewInit() {

  }

  addRow() {
    this.list.splice(this.elementIndex, 0, RowComponent);

    this.elementIndex++;
  }

  remove(idx: number) {
    this.list.splice(idx, 1);
  }

}

DesignerComponent.html

<div #builder class="row">
  <div class="s1 teal lighten-2">
    <p class="flow-text">teste do html builder</p>

    <div *ngFor="let row of list; let idx = index" >
      <p class="flow-text">Linha {{idx}}</p>
      <dcl-wrapper [type]="row"></dcl-wrapper>

      <a class="btn-floating btn-small waves-effect waves-light purple" (click)="remove(idx)"><i class="material-icons">remove</i></a>
    </div>

  </div>

</div>
<a class="btn-floating btn-large waves-effect waves-light red" (click)="addRow()"><i class="material-icons">add</i></a>

RowComponent.html

<div #row class="row">
  <div class="s12 teal lighten-2">
    <p class="flow-text">adicionando linha no html builder</p>
  </div>
  <div *ngFor="let col of colList; let colIndex = index">
    <p>Column</p>
    <dcl-wrapper [type]="col"></dcl-wrapper>
  </div>
  <a class="btn-floating btn-small waves-effect waves-light waves-teal" (click)="addColumn()"><i class="material-icons">view_column</i></a>
</div>

ColumnComponent.html

<div class="col s1 purple lighten-2">
  <p class="flow-text">column added ....</p>
</div>

此方法生成以下错误:

检查后表达式已更改。先前的值:“ CD_INIT_VALUE”。当前值:

有没有人把它当作嵌套元素来工作的?

非常感谢您的帮助!

yurzui

尝试使用ngAfterContentInit钩子代替ngAfterViewInit您的DynWrapperComponent

dyn-wrapper.component.ts

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular2:动态添加主机

来自分类Dev

Angular2:动态添加主机

来自分类Dev

如何在Angular2 +中向动态创建的元素添加属性?

来自分类Dev

Angular2向元素添加属性

来自分类Dev

带有ngFor元素的ngModel的动态angular2形式

来自分类Dev

Angular2 +中动态渲染输入元素的指令

来自分类Dev

Angular2 + MaterialDesignLite:动态添加html属性

来自分类Dev

将动态参数添加到angular2 +路线

来自分类Dev

在Angular2 FormGroup中验证动态添加的输入

来自分类Dev

在angular2的componentRef上添加动态隐藏属性

来自分类Dev

Angular2动态模板

来自分类Dev

检查元素是否在Angular2中对attr / class进行了动态标记

来自分类Dev

如何在angular2中动态格式化输入元素?

来自分类Dev

Angular2点击一个动态生成的元素

来自分类Dev

在Angular中向元素动态添加指令

来自分类Dev

如何动态添加 HTML 元素/内容 - Angular

来自分类Dev

angular2使用输入来动态添加到表单模型

来自分类Dev

Angular2中的动态模板“包含”

来自分类Dev

Angular2 RC和动态路线

来自分类Dev

Angular2动态加载模板

来自分类Dev

Angular2:动态同步http请求

来自分类Dev

在Angular2中动态加载组件

来自分类Dev

Angular2 routerLink指令动态参数?

来自分类Dev

在Angular2中动态加载组件

来自分类Dev

在Angular2中创建动态数组

来自分类Dev

Angular2 部分动态组件方法

来自分类Dev

Angular2 动态获取组件引用

来自分类Dev

我如何使用angular2将元素添加到身体

来自分类Dev

Angular2 NgFor内部树模型:删除然后添加元素时顺序错误