首页 > 编程 > JavaScript > 正文

详解Angular2组件之间如何通信

2019-11-19 16:16:47
字体:
来源:转载
供稿:网友

组件之间的共享可以有好几种方式

父->子 input 方式

import {Component,Input} from 'angular2/core';@Component({  selector: 'child',  template: `    <h2>child {{content}}</h2>  `})class Child {  @Input() content:string;}@Component({  selector: 'App',  directives: [Child],  template: `    <h1>App</h1>    <child [content]="i"></child>  `})export class App {  i:number = 0;  constructor() {    setInterval(()=> {      this.i++;    }, 1000)  }}

子->父 output 方式

import {Output,EventEmitter,Component} from 'angular2/core';@Component({  selector: 'child',  template: `    <h2>child</h2>  `})class Child {  @Output() updateNumberI:EventEmitter<number> = new EventEmitter();  i:number = 0;  constructor() {    setInterval(()=> {      this.updateNumberI.emit(++this.i);    }, 1000)  }}@Component({  selector: 'App',  directives: [Child],  template: `    <h1>App {{i}}</h1>    <child (updateNumberI)="numberIChange($event)"></child>  `})export class App {  i:number = 0;  numberIChange(i:number){    this.i = i;  }}

子获得父实例

如果不了解forwardRef用处的的可以看 #11

@Host 表示这个Injector必须是host element在这里可以理解为 parent

import {Host,Component,forwardRef} from 'angular2/core';@Component({  selector: 'child',  template: `    <h2>child</h2>  `})class Child {  constructor(@Host() @Inject(forwardRef(()=> App)) app:App) {    setInterval(()=> {      app.i++;    }, 1000);  }}@Component({  selector: 'App',  directives: [Child],  template: `    <h1>App {{i}}</h1>    <child></child>  `})export class App {  i:number = 0;}

父获得子实例

子元素指令在父constructor时是获取不到的,所以必须在组件的ngAfterViewInit生命周期钩子后才能获取,如果对组件生命周期不了解的话,可以参考#56

import {ViewChild,Component} from 'angular2/core';@Component({  selector: 'child',  template: `    <h2>child {{i}}</h2>  `})class Child {  i:number = 0;}@Component({  selector: 'App',  directives: [Child],  template: `    <h1>App {{i}}</h1>    <child></child>  `})export class App {  @ViewChild(Child) child:Child;  ngAfterViewInit() {    setInterval(()=> {      this.child.i++;    }, 1000)  }}

service 方式

import {Component,Injectable} from 'angular2/core';@Injectable();class KittencupService {  i:number = 0;}@Component({  selector: 'child',  template: `    <h2>child {{service.i}}</h2>  `})class Child {  constructor(public service:KittencupService){  }}@Component({  selector: 'App',  directives: [Child],  providers: [KittencupService],  template: `    <h1>App {{i}}</h1>    <child></child>  `})export class App {  constructor(service:KittencupService) {    setInterval(()=> {      service.i++;    }, 1000)  }}

service EventEmitter方式

import {Component,Injectable,EventEmitter} from 'angular2/core';@Injectable()class KittencupService {  change: EventEmitter<number>;  constructor(){    this.change = new EventEmitter();  }}@Component({  selector: 'child',  template: `<h2>child {{i}}</h2>`})class Child {  public i:number = 0;  constructor(public service:KittencupService){    service.change.subscribe((value:number)=>{      this.i = value;    })  }}@Component({  selector: 'App',  directives: [Child],  providers: [KittencupService],  template: `<h1>App {{i}}</h1><child></child>`})export class App {  i:number = 0;  constructor(service:KittencupService) {    setInterval(()=> {      service.change.emit(++this.i);    }, 1000)  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表