详解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 相关文章推荐
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
浅析Js中的单引号与双引号问题
Nov 06 Javascript
让浏览器DOM元素最后加载的js方法
Jul 29 Javascript
a标签的href与onclick事件的区别详解
Nov 12 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
使用JavaScript+canvas实现图片裁剪
Jan 30 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
Apr 14 Javascript
深入理解JS中的substr和substring
Apr 26 Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
Sep 06 Javascript
ES6中class类用法实例浅析
Apr 06 Javascript
javascript 日期相减-在线教程(附代码)
Aug 17 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 XPath对XML文件查找及修改实现代码
2011/07/27 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php验证码生成器
2017/05/24 PHP
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
json数据的列循环示例
2013/09/06 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
python中关于日期时间处理的问答集锦
2013/03/08 Python
python文件操作相关知识点总结整理
2016/02/22 Python
python如何实现一个刷网页小程序
2018/11/27 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
反邪教宣传工作方案
2014/05/07 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
Html5调用企业微信的实现
2021/04/16 HTML / CSS
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
Linux磁盘管理方法介绍
2022/06/01 Servers
python内置模块之上下文管理contextlib
2022/06/14 Python