angular组件通讯

本文详细介绍了Angular中父组件与子组件之间的多种通信方式,包括使用Input进行父传子、Output实现子传父、通过ViewChild获取子组件实例以及利用Service进行跨组件数据共享。通过具体的代码示例,展示了如何在实际项目中有效运用这些通信机制。
摘要由CSDN通过智能技术生成

参考:
https://blog.csdn.net/liuyu5210/article/details/76559957
http://www.cnblogs.com/banluduxing/p/9290569.html

  • 父传子,使用Input

父html:

<div>
  component-communication works!
  <div>
    <button nz-button (click)="changeColor();">改变childColor的值</button>
  </div>
  <app-child-component [childColor]='colorFlag'></app-child-component>
</div>

父ts:

  public colorFlag = false;

  changeColor() {
    this.colorFlag = !this.colorFlag;
    console.log('父组件的colorFlag值:', this.colorFlag);
  }

子组件html:

<p>
  child-component works!------------{{childColor}}
</p>
<div [ngClass]="{'color-red':childColor}">
  我是div的内容,颜色是否会改变
</div>

子组件ts:

@Input() childColor:any;
  • 子传父:Output

父HTML:

<div>
  <div>父页面</div>
  <div>父页面的值-{{fatherNumber}}</div>
  <app-child-component (childEvent)="fatherEvent($event);"></app-child-component>
</div>

父TS:

  public fatherNumber: any;

  fatherEvent(e) {
    console.log('传递到父组件的值:', e);
    this.fatherNumber = e;
  }

子HTML:

<div>
  <div>子页面</div>
  <div>子页面的值-{{childNumber}}</div>
  <button nz-button (click)="changeNumber();">改变父页面的值</button>
</div>

子TS:

  @Output() childEvent: EventEmitter = new EventEmitter();
  public childNumber = 0;

  changeNumber() {
    this.childNumber++;
    this.childEvent.emit(this.childNumber);// 可以有参数,也可以没有参数
  }
  • 子获得父的实例:

父HTML:

<div>
  <div>父页面</div>
  <div>父页面的值-{{fatherNumber}}</div>
  <app-child-component></app-child-component>
</div>

父TS:

 public fatherNumber: any=0;

子HTML:

<div>
  <div>子页面</div>
  <div>子页面的值-{{childNumber}}</div>
  <button nz-button (click)="changeNumber();">改变父页面的值</button>
</div>

子TS:

// 如何在自己的函数中获取到app呢???
constructor(@Host()
              @Inject(forwardRef(() => ComponentCommunicationComponent))
                app: ComponentCommunicationComponent) {
    console.log(app);
    setInterval(() => {
      app.fatherNumber++;
    }, 1000);
  }

ComponentCommunicationComponent是父组件的名称,在子组件中的使用,eg:

this.app.search(); // 调用父组件的函数,或者使用属性。
  • 父组件获取子组件的实例

父HTML:

<div>
  <div>父页面</div>
  <div>父页面的值-{{fatherNumber}}</div>
  <button nz-button (click)="changeNumber();">改变子组件里面的值</button>
  <app-child-component></app-child-component>
</div>

父TS:

 /**
   * 父组件改变子组件里面的值
   */
  @ViewChild(ChildComponentComponent) child: ChildComponentComponent;

  changeNumber() {
    this.child.childNumber++; // 子组件里面有childNumber的值
  }

  • service存储值或者函数

service文件:

 i=0;
  test(){
    console.log("test函数执行了");
  }

父HTML:

<div>
  <div>父页面</div>
  <div>父页面的值-{{myService.i}}</div>
  <button nz-button (click)="changeNumber();">改变子组件里面的值</button>
  <app-child-component></app-child-component>
</div>

父ts:


  constructor(public myService: MyServiceService) { }
  /**
   * 父组件改变子组件里面的值
   */
  changeNumber() {
    this.myService.i++;
    console.log('父组件里面的值:', this.myService);
    this.myService.test();
  }

子HTML:

<div>
  <div>子页面</div>
  <div>子页面的值-{{myService.i}}</div>
  <button nz-button (click)="changeNumber();">改变父页面的值</button>
</div>

子ts:

constructor(public myService: MyServiceService) {  }
  /**
   * 子组件改变父组件的值
   */
  changeNumber() {
    this.myService.i++;
    this.myService.test();
  }
  • EventEmitter

service:

export class MyServiceService {
  change: EventEmitter = new EventEmitter();
}

父ts:

constructor(public myService: MyServiceService) { }
  public fatherNumber: any = 0;

  /**
   * 父组件改变子组件里面的值
   */

  changeNumber() {
   this.myService.change.emit(++this.fatherNumber);
  }

子ts:

 constructor(public myService: MyServiceService) { }
  ngOnInit() {
    this.myService.change.subscribe((value) => {
      this.childNumber = value;
    });
  }
  public childNumber = 0;

也可以反向操作,在子发散,在父订阅,那么这么点击父或者子的改变数值函数,都会执行,且数字同步!(有点像订阅了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值