详解Angular2组件之间如何通信


Posted in Javascript onJune 22, 2017

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

父->子 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)
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js动画(animate)简单引擎代码示例
Dec 04 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
Dec 14 Javascript
js动态拼接正则表达式的两种方法
Mar 04 Javascript
jQuery控制TR显示隐藏的几种方法
Jun 18 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
Aug 25 Javascript
jQuery+PHP星级评分实现方法
Oct 02 Javascript
jQuery中事件与动画的总结分享
May 24 Javascript
Vue中div contenteditable 的光标定位方法
Aug 25 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 Javascript
微信小程序上传文件到阿里OSS教程
May 20 Javascript
vue 实现element-ui中的加载中状态
Nov 11 Javascript
JavaScript ES6的函数拓展
Jan 18 Javascript
Angular2 父子组件数据通信实例
Jun 22 #Javascript
详解Angular之constructor和ngOnInit差异及适用场景
Jun 22 #Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
Jun 22 #Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 #jQuery
详解Vue 2.0封装axios笔记
Jun 22 #Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 #Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
Jun 22 #Javascript
You might like
php+mysql查询优化简单实例
2015/01/13 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
JavaScript效率调优经验
2009/06/04 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
Numpy 多维数据数组的实现
2020/06/18 Python
python实现斗地主分牌洗牌
2020/06/22 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
物流专业求职计划书
2014/01/10 职场文书
优秀教师获奖感言
2014/01/31 职场文书
实习指导老师评语
2014/04/26 职场文书
五心教育心得体会
2014/09/04 职场文书
事业单位年度考核评语
2014/12/31 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
python基础详解之if循环语句
2021/04/24 Python