详解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 相关文章推荐
JavaScript将取代AppleScript?
Sep 18 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
Feb 13 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
jQuery选择器源码解读(一):Sizzle方法
Mar 31 Javascript
JavaScript中的Math.LOG2E属性使用详解
Jun 14 Javascript
通过jquery实现页面的动画效果(实例代码)
Sep 18 Javascript
简单谈谈关于 npm 5.0 的新坑
Jun 08 Javascript
AngularJs 延时器、计时器实例代码
Sep 16 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
Jan 25 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
关于vue的列表图片选中打钩操作
Sep 09 Javascript
关于vue 项目中浏览器跨域的配置问题
Nov 10 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脚本的10个技巧(3)
2006/10/09 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP生成压缩文件实例
2015/02/07 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
Python只用40行代码编写的计算器实例
2017/05/10 Python
python装饰器实例大详解
2017/10/25 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
实时获取Python的print输出流方法
2019/01/07 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
python3.5的包存放的具体路径
2020/08/16 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
惠普香港官方商店:HP香港
2019/04/30 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
保险专业大专生求职信
2013/10/26 职场文书
党员评议自我评价
2015/03/03 职场文书
摩登时代观后感
2015/06/03 职场文书
2016年教师节慰问信
2015/12/01 职场文书
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android