详解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 相关文章推荐
永不消失的title提示代码
Feb 15 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
Aug 19 Javascript
JQuery动态添加和删除表格行的方法
Mar 09 Javascript
Kindeditor在线文本编辑器如何过滤HTML
Apr 14 Javascript
jQuery通过写入cookie实现更换网页背景的方法
Apr 15 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
Jul 01 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 Javascript
vue.js实现备忘录功能的方法
Jul 10 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 Javascript
Vue是怎么渲染template内的标签内容的
Jun 05 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 set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
编辑浪子版表单验证类
2007/05/12 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
JS实现随机点名器
2020/04/12 Javascript
python根据经纬度计算距离示例
2014/02/16 Python
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python之PyUnit单元测试实例
2014/10/11 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
详解python while 函数及while和for的区别
2018/09/07 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
Python实现一个优先级队列的方法
2020/07/31 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
公司新员工的演讲稿注意事项
2014/01/01 职场文书
爱我中华教学反思
2014/04/28 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
大学生党性分析材料
2014/12/19 职场文书
外国人来华邀请函
2015/01/31 职场文书
班主任高考寄语
2015/02/26 职场文书
绿色环保倡议书
2015/04/28 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
售房协议书范本
2015/08/11 职场文书
初中班主任心得体会
2016/01/07 职场文书