详解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 相关文章推荐
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
Dec 31 Javascript
js 三级关联菜单效果实例
Aug 13 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
confirm的用法示例用于按钮操作时确定是否执行
Jun 19 Javascript
Bootstrap按钮下拉菜单组件详解
May 10 Javascript
JavaScript中return用法示例
Nov 29 Javascript
关于AngularJs数据的本地存储详解
Jan 20 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
Mar 08 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
Nov 17 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
微信小程序中网络请求缓存的解决方法
Dec 29 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 22 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 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
php绘制一条直线的方法
2015/01/24 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
部署Python的框架下的web app的详细教程
2015/04/30 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Python中base64与xml取值结合问题
2019/12/22 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
优秀员工自荐书范文
2013/12/08 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
运动会的口号
2014/06/09 职场文书
环境卫生标语
2014/06/09 职场文书
学雷锋宣传标语
2014/06/25 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
市场督导岗位职责
2015/04/10 职场文书
社会实践单位意见
2015/06/05 职场文书
战马观后感
2015/06/08 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
python基础之匿名函数详解
2021/04/21 Python
mysql如何配置白名单访问
2021/06/30 MySQL