详解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效果之图片减速度滚动实现代码
Dec 08 Javascript
location.href用法总结(最主要的)
Dec 27 Javascript
JavaScript的Vue.js库入门学习教程
May 23 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
基于AngularJS前端云组件最佳实践
Oct 20 Javascript
BootStrap Fileinput的使用教程
Dec 30 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
Sep 01 Javascript
微信小程序使用canvas的画图操作示例
Jan 18 Javascript
Vue利用Blob下载原生二进制数组文件
Sep 25 Javascript
Vue3.0 响应式系统源码逐行分析讲解
Oct 14 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
JS实现分页导航效果
2020/02/19 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
python实现解数独程序代码
2017/04/12 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
python实现tail -f 功能
2020/01/17 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
临床护理求职信
2014/04/26 职场文书
结婚保证书范文
2014/04/29 职场文书
评先进个人材料
2014/12/29 职场文书
学生保证书
2015/01/16 职场文书
初中家长意见
2015/06/03 职场文书
python3操作redis实现List列表实例
2021/08/04 Python