详解Angular2组件之间如何通信

发布时间 - 2026-01-11 02:00:36    点击率:

组件之间的共享可以有好几种方式

父->子 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)
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Angular组件之间通信  # Angular组件通信  # Angular2组件通信  # Angular2 父子组件数据通信实例  # Angular2 父子组件通信方式的示例  # angular中不同的组件间传值与通信的方法  # Angular 2父子组件之间共享服务通信的实现  # Angular2 组件通信的实例代码  # Angularjs2不同组件间的通信实例代码  # angular4 共享服务在多个组件中数据通信的示例  # 不了解  # 在这里  # 大家多多  # 好几种  # content  # Child 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  昵图网官方站入口 昵图网素材图库官网入口  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何在宝塔面板中修改默认建站目录?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  如何解决hover在ie6中的兼容性问题  Android okhttputils现在进度显示实例代码  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在阿里云通过域名搭建网站?  如何快速搭建高效WAP手机网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  Python图片处理进阶教程_Pillow滤镜与图像增强  利用 Google AI 进行 YouTube 视频 SEO 描述优化  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel怎么在Controller之外的地方验证数据  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  手机网站制作与建设方案,手机网站如何建设?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Python自动化办公教程_ExcelWordPDF批量处理案例  佛山网站制作系统,佛山企业变更地址网上办理步骤?  香港网站服务器数量如何影响SEO优化效果?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何登录建站主机?访问步骤全解析  微信小程序 配置文件详细介绍  Firefox Developer Edition开发者版本入口  大连网站制作公司哪家好一点,大连买房网站哪个好?  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel如何实现一对一模型关联?(Eloquent示例)  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Laravel如何与Inertia.js和Vue/React构建现代单页应用  nodejs redis 发布订阅机制封装实现方法及实例代码  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  如何在七牛云存储上搭建网站并设置自定义域名?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  网站页面设计需要考虑到这些问题  如何确认建站备案号应放置的具体位置?