angular学习总结十——动态创建组件并实现交互一

ps:看了好多篇动态组件的博客,坑啊,只是放进去一个静态组件,并未加上Input,Output

appModule

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

import { AppComponent } from './app.component';
import { FormsModule } from '@angular/forms';
import { DynamicComponent } from './dynamic/dynamic.component';

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

首先动态组件1的实现方式必须在entryComponents中声明

app.component.ts

import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';
import { DynamicComponent } from './dynamic/dynamic.component';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
  username = 'zengwe';
  @ViewChild('content', { read: ViewContainerRef }) content: ViewContainerRef;
  constructor(private componentFactory: ComponentFactoryResolver) {

  }
  add() {
    const component = this.componentFactory.resolveComponentFactory(DynamicComponent);
    component.inputs.push({propName: 'dd', templateName: 'ss'});
    const com = this.content.createComponent(component);
    console.log(com.instance);
    com.instance.dd = 'dd传的值';
    com.instance.out.subscribe((res) => {
      console.log(res);
    });
  }
  remove() {
    this.content.clear();
  }
}

1.com.instance就是向组件中加入数据和订阅Output的事件
this.content.createComponent(component)中的参数中可加入第二个参数id:number
这样可以this.content.remove(id)删除指定的组件

app.component.html

<div>
  <h1>dynamic</h1>
  <div>
    <h2>dynamic container</h2>
    <div #content></div>
  </div>
  <button (click)="add()">add</button>
  <button (click)="remove()">remove</button>
</div>

dynamic.componet.ts

import { Component, OnInit, Input, AfterViewInit, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-dynamic',
  templateUrl: './dynamic.component.html',
  styleUrls: ['./dynamic.component.css']
})
export class DynamicComponent implements OnInit, AfterViewInit {
  @Input('dd') dd: any;
  @Input('ss') ss: any;
  @Output('out') out = new EventEmitter();
  constructor() { }

  ngOnInit() {
  }
  ngAfterViewInit() {
    console.log(this.dd);
    console.log(this.ss);
    console.log(this);
  }
  outEvent() {
    this.out.emit('outValue');
  }
}

dynamic.component.html

<div class="">
  <span>dynamic componet</span>
  <div>{{dd}}</div>
  <div>{{ss}}</div>
  <button (click)="outEvent($evnet)">click out value</button>
</div>
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值