我们可以通过以下三种方式来实现:

  1. 传递一个组件的引用给另一个组件
  2. 通过子组件发送EventEmitter和父组件通信
  3. 通过serive通信

1. 传递一个组件的引用给另一个组件

Demo1 模板引用变量

  1. 模板引用变量通常用来引用模板中的某个 DOM 元素,它还可以引用 Angular 组件或指令或Web Component
    使用井号 (#) 来声明引用变量。 #phone 的意思就是声明一个名叫 phone 的变量来引用 元素

这种方式适合组件间有依赖关系。 app component

  1. <app-side-bar-toggle [sideBar]="sideBar"></app-side-bar-toggle>
  2. <app-side-bar #sideBar></app-side-bar>

app.component.html

  1. @Component({
  2. selector: 'app-side-bar-toggle',
  3. templateUrl: './side-bar-toggle.component.html',
  4. styleUrls: ['./side-bar-toggle.component.css']
  5. })
  6. export class SideBarToggleComponent {
  7.  
  8. @Input() sideBar: SideBarComponent;
  9.  
  10. @HostListener('click')
  11. click() {
  12. this.sideBar.toggle();
  13. }
  14. }

side-bar-toggle.component.ts

  1. @Component({
  2. selector: 'my-app',
  3. templateUrl: './app.component.html',
  4. styleUrls: [ './app.component.css' ]
  5. })
  6. export class AppComponent {
  7. sideBarIsOpened = false;
  8.  
  9. toggleSideBar(shouldOpen: boolean) {
  10. this.sideBarIsOpened = !this.sideBarIsOpened;
  11. }
  12. }

2. 通过子组件发送EventEmitter和父组件通信

Demo2 这种方式利用事件传播,需要在子组件中写 app.component.html

  1. <app-side-bar-toggle (toggle)="toggleSideBar()"></app-side-bar-toggle>
  2. <app-side-bar [isOpen]="sideBarIsOpened"></app-side-bar>

app.component.ts

  1. @Component({
  2. selector: 'my-app',
  3. templateUrl: './app.component.html',
  4. styleUrls: [ './app.component.css' ]
  5. })
  6. export class AppComponent {
  7. sideBarIsOpened = false;
  8.  
  9. toggleSideBar(shouldOpen: boolean) {
  10. this.sideBarIsOpened = !this.sideBarIsOpened;
  11. }
  12. }

side-bar-toggle.component.ts

  1. @Component({
  2. selector: 'app-side-bar-toggle',
  3. templateUrl: './side-bar-toggle.component.html',
  4. styleUrls: ['./side-bar-toggle.component.css']
  5. })
  6. export class SideBarToggleComponent {
  7.  
  8. @Output() toggle: EventEmitter<null> = new EventEmitter();
  9.  
  10. @HostListener('click')
  11. click() {
  12. this.toggle.emit();
  13. }
  14. }

side-bar.component.ts

  1. @Component({
  2. selector: 'app-side-bar',
  3. templateUrl: './side-bar.component.html',
  4. styleUrls: ['./side-bar.component.css']
  5. })
  6. export class SideBarComponent {
  7.  
  8. @HostBinding('class.is-open') @Input()
  9. isOpen = false;
  10. }

3. 通过service进行通信

Demo3 这里需要新建side-bar.service,我们把toggle方法写到service文件中, 然后将service注入到side-bar-toggle.component和side-bar-toggle.component,前者调用toggle方法,发送事件流,后者订阅事件

app.component.html

  1. <app-side-bar-toggle></app-side-bar-toggle>
  2. <app-side-bar></app-side-bar>

side-bar-toggle.component.ts

  1. @Component({
  2. selector: 'app-side-bar-toggle',
  3. templateUrl: './side-bar-toggle.component.html',
  4. styleUrls: ['./side-bar-toggle.component.css']
  5. })
  6. export class SideBarToggleComponent {
  7.  
  8. constructor(
  9. private sideBarService: SideBarService
  10. ) { }
  11.  
  12. @HostListener('click')
  13. click() {
  14. this.sideBarService.toggle();
  15. }
  16. }

side-bar.component.ts

  1. @Component({
  2. selector: 'app-side-bar',
  3. templateUrl: './side-bar.component.html',
  4. styleUrls: ['./side-bar.component.css']
  5. })
  6. export class SideBarComponent {
  7.  
  8. @HostBinding('class.is-open')
  9. isOpen = false;
  10.  
  11. constructor(
  12. private sideBarService: SideBarService
  13. ) { }
  14.  
  15. ngOnInit() {
  16. this.sideBarService.change.subscribe(isOpen => {
  17. this.isOpen = isOpen;
  18. });
  19. }
  20. }

side-bar.service.ts

  1. @Injectable()
  2. export class SideBarService {
  3.  
  4. isOpen = false;
  5.  
  6. @Output() change: EventEmitter<boolean> = new EventEmitter();
  7.  
  8. toggle() {
  9. this.isOpen = !this.isOpen;
  10. this.change.emit(this.isOpen);
  11. }
  12. }
  1.  

Angular 组件通信的三种方式的更多相关文章

  1. 黑马vue---56-58、vue组件创建的三种方式

    黑马vue---56-58.vue组件创建的三种方式 一.总结 一句话总结: 不论是哪种方式创建出来的组件,组件的 template 属性指向的模板内容,必须有且只能有唯一的一个根元素 1.使用 Vu ...

  2. Vue组件之间通信的三种方式

    最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...

  3. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  4. vue组件通信的几种方式

    最近用vue开发项目,记录一下vue组件间通信几种方式 第一种,父子组件通信 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child ...

  5. Vue自定义组件以及组件通信的几种方式

    本帖子来源:小贤笔记 功能 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它 ...

  6. React: React组件创建的三种方式

    一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...

  7. React中组件通信的几种方式

    https://segmentfault.com/a/1190000012361461 需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...

  8. VC 线程间通信的三种方式

    1.使用全局变量(窗体不适用)     实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通 ...

  9. 【转】VC 线程间通信的三种方式

    原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用)      实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和 ...

随机推荐

  1. 51nod_1001 数组中和等于K的数对(二分)

    题意: 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9 ...

  2. oracle 账号解锁 java.sql.SQLException: ORA-28000: the account is locked

    日志报错:ORA-28000: the account is locked 1.plsql登录提示用户被锁定 2.sys登录sqlplus登录查看 SQL> select username,ac ...

  3. 折腾systemd-nspawn运行centos7

    Archlinux创建Debian/Ubuntu的systemd-nspawn容器是很简单的,因为有debootstrap软件.某天我突然想装个centos7玩玩,搜了半天没发现有什么类似于deboo ...

  4. Spark中的两种模式

    两种模式 client-了解 cluster模式-开发使用 操作 1.需要Yarn集群 2.历史服务器 3.提交任务的的客户端工具-spark-submit命令 4.待提交的spark任务/程序的字节 ...

  5. lua入门之环境搭建、第一个demo

    前言 前段时间因为有些项目功能需要,自己研究了下lua,今天整理下,并以一个demo为示例演示 手机上的运行效果 分为几个步骤来逐步讲解. 1.lua介绍,为什么选择它? 2.环境安装 3.撸一个简单 ...

  6. 第三课 Dubbo设计中的设计模式

    责任链模式  责任链模式在Dubbo中发挥的作用举足轻重,就像是Dubbo框架的骨架.Dubbo的调用链组织是用责任链模式串连起来的. 责任链中的每个节点实现Filter接口,然后由ProtocolF ...

  7. 4.ASCII码排序

    描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之 ...

  8. java中static关键字的解析

    静态的特点: A:随着类的加载而加载 B:优先于对象而存在 C:静态是被所有对象共享的数据 这也是我们来判断是否使用静态的标准 D:静态的出现,让我们的调用方式多了一种 类名.静态的内容 非静态的内容 ...

  9. [loj6278]数列分块入门2

    做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...

  10. [loj3333]混合物

    假设选择的调味瓶为$k_{1}<k_{2}<...<k_{s}$,即判定是否存在正有理数解$\{x_{1},x_{2},...,x_{s}\}$,满足$$(\sum_{i=1}^{s ...