详解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 相关文章推荐
Firefox 无法获取cssRules 的解决办法
Oct 11 Javascript
一种JavaScript的设计模式
Nov 22 Javascript
获取Javscript执行函数名称的方法
Dec 22 Javascript
javascript中indexOf技术详解
May 07 Javascript
javaScript中Math()函数注意事项
Jun 18 Javascript
jQuery UI库中dialog对话框功能使用全解析
Apr 23 Javascript
AngularJs IE Compatibility 兼容老版本IE
Sep 01 Javascript
JS调用打印机功能简单示例
Nov 28 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
Sep 22 Javascript
一次记住JavaScript的6个正则表达式方法
Feb 22 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
Aug 25 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
ADODB类使用
2006/11/25 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
动态加载js的几种方法
2006/10/23 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python中关键字is与==的区别简述
2014/07/31 Python
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python多进程并行代码实例
2019/09/30 Python
提升python处理速度原理及方法实例
2019/12/25 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
python 实现图片裁剪小工具
2021/02/02 Python
css3 transform属性详解
2014/09/30 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
正风肃纪剖析材料范文
2014/10/10 职场文书
学习三严三实心得体会
2014/10/13 职场文书
男方婚前保证书
2015/02/28 职场文书
2016新年感言
2015/08/03 职场文书
python实现双链表
2022/05/25 Python