详解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 innerHTML 的一些问题的解决方法
Jun 22 Javascript
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
js动态修改整个页面样式达到换肤效果
May 23 Javascript
jQuery设置和获取HTML、文本和值示例
Jul 08 Javascript
用原生js做个简单的滑动效果的回到顶部
Oct 15 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
深入探秘jquery瀑布流的实现
Jan 30 Javascript
基于JavaScript实现拖动滑块效果
Feb 16 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
Mar 21 jQuery
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 Javascript
vue项目国际化vue-i18n的安装使用教程
Mar 14 Javascript
详解webpack模块加载器兼打包工具
Sep 11 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
php正则校验用户名介绍
2008/07/19 PHP
二招解决php乱码问题
2012/03/25 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
做web开发 先学JavaScript
2014/12/12 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
Python中的hypot()方法使用简介
2015/05/18 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
python字符串string的内置方法实例详解
2018/05/14 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
四风存在的原因分析
2014/02/11 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
校园文明标语
2014/06/13 职场文书
学校党员对照检查材料
2014/08/28 职场文书
公司委托书格式范本
2014/09/16 职场文书
作风整顿剖析材料
2014/09/30 职场文书
单位未婚证明范本
2014/11/25 职场文书
道歉情书大全
2015/05/12 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
使用Python解决图表与画布的间距问题
2022/04/11 Python