详解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下对ajax的onreadystatechange的支持情况分析
Dec 14 Javascript
读jQuery之四(优雅的迭代)
Jun 20 Javascript
多个js与css文件的合并方法详细说明
Dec 26 Javascript
js内存泄露的几种情况详细探讨
May 31 Javascript
jQuery弹出层插件Lightbox_me使用指南
Apr 21 Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 Javascript
JavaScript获取服务器端时间的方法
Nov 29 Javascript
jQuery.cookie.js使用方法及相关参数解释
Mar 06 Javascript
js 两数组去除重复数值的实例
Dec 06 Javascript
在小程序中使用canvas的方法示例
Sep 17 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
Apr 25 Javascript
js核心基础之闭包的应用实例分析
May 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
PHP也可以?成Shell Script
2006/10/09 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
python操作oracle的完整教程分享
2018/01/30 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
Python集合操作方法详解
2020/02/09 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
实习教师自我鉴定
2013/12/09 职场文书
护士个人自我鉴定
2014/03/24 职场文书
个人催款函范文
2015/06/24 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers