详解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 相关文章推荐
JS实现三个层重叠点击互相切换的方法
Oct 06 Javascript
JavaScript中获取时间的函数集
Aug 16 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
Sep 20 Javascript
AngularJS入门教程之MVC架构实例分析
Nov 01 Javascript
学习vue.js计算属性
Dec 03 Javascript
angular指令笔记ng-options的使用方法
Sep 18 Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
详解angular脏检查原理及伪代码实现
Jun 08 Javascript
Webpack devServer中的 proxy 实现跨域的解决
Jun 15 Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 Javascript
jQuery选择器之基本选择器用法实例分析
Feb 19 jQuery
基于canvas实现手写签名(vue)
May 21 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基础陷阱题(变量赋值)
2012/09/12 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
onpropertypchange
2006/07/01 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
Python中Django发送带图片和附件的邮件
2017/03/31 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
医学专业应届生的自我评价
2014/02/28 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
解除同居协议书
2015/01/29 职场文书
2015大学生求职信范文
2015/03/20 职场文书
环保证明
2015/06/23 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL