Angular 组件通信的三种方式
我们可以通过以下三种方式来实现:
- 传递一个组件的引用给另一个组件
- 通过子组件发送EventEmitter和父组件通信
- 通过serive通信
1. 传递一个组件的引用给另一个组件
- 模板引用变量通常用来引用模板中的某个 DOM 元素,它还可以引用 Angular 组件或指令或Web Component。
使用井号 (#) 来声明引用变量。 #phone 的意思就是声明一个名叫 phone 的变量来引用 元素
这种方式适合组件间有依赖关系。 app component
- <app-side-bar-toggle [sideBar]="sideBar"></app-side-bar-toggle>
- <app-side-bar #sideBar></app-side-bar>
- @Component({
- selector: 'app-side-bar-toggle',
- templateUrl: './side-bar-toggle.component.html',
- styleUrls: ['./side-bar-toggle.component.css']
- })
- export class SideBarToggleComponent {
- @Input() sideBar: SideBarComponent;
- @HostListener('click')
- click() {
- this.sideBar.toggle();
- }
- }
- @Component({
- selector: 'my-app',
- templateUrl: './app.component.html',
- styleUrls: [ './app.component.css' ]
- })
- export class AppComponent {
- sideBarIsOpened = false;
- toggleSideBar(shouldOpen: boolean) {
- this.sideBarIsOpened = !this.sideBarIsOpened;
- }
- }
2. 通过子组件发送EventEmitter和父组件通信
Demo2 这种方式利用事件传播,需要在子组件中写 app.component.html
- <app-side-bar-toggle (toggle)="toggleSideBar()"></app-side-bar-toggle>
- <app-side-bar [isOpen]="sideBarIsOpened"></app-side-bar>
- @Component({
- selector: 'my-app',
- templateUrl: './app.component.html',
- styleUrls: [ './app.component.css' ]
- })
- export class AppComponent {
- sideBarIsOpened = false;
- toggleSideBar(shouldOpen: boolean) {
- this.sideBarIsOpened = !this.sideBarIsOpened;
- }
- }
- @Component({
- selector: 'app-side-bar-toggle',
- templateUrl: './side-bar-toggle.component.html',
- styleUrls: ['./side-bar-toggle.component.css']
- })
- export class SideBarToggleComponent {
- @Output() toggle: EventEmitter<null> = new EventEmitter();
- @HostListener('click')
- click() {
- this.toggle.emit();
- }
- }
- @Component({
- selector: 'app-side-bar',
- templateUrl: './side-bar.component.html',
- styleUrls: ['./side-bar.component.css']
- })
- export class SideBarComponent {
- @HostBinding('class.is-open') @Input()
- isOpen = false;
- }
3. 通过service进行通信
Demo3 这里需要新建side-bar.service,我们把toggle方法写到service文件中, 然后将service注入到side-bar-toggle.component和side-bar-toggle.component,前者调用toggle方法,发送事件流,后者订阅事件
- <app-side-bar-toggle></app-side-bar-toggle>
- <app-side-bar></app-side-bar>
- @Component({
- selector: 'app-side-bar-toggle',
- templateUrl: './side-bar-toggle.component.html',
- styleUrls: ['./side-bar-toggle.component.css']
- })
- export class SideBarToggleComponent {
- constructor(
- private sideBarService: SideBarService
- ) { }
- @HostListener('click')
- click() {
- this.sideBarService.toggle();
- }
- }
- @Component({
- selector: 'app-side-bar',
- templateUrl: './side-bar.component.html',
- styleUrls: ['./side-bar.component.css']
- })
- export class SideBarComponent {
- @HostBinding('class.is-open')
- isOpen = false;
- constructor(
- private sideBarService: SideBarService
- ) { }
- ngOnInit() {
- this.sideBarService.change.subscribe(isOpen => {
- this.isOpen = isOpen;
- });
- }
- }
- @Injectable()
- export class SideBarService {
- isOpen = false;
- @Output() change: EventEmitter<boolean> = new EventEmitter();
- toggle() {
- this.isOpen = !this.isOpen;
- this.change.emit(this.isOpen);
- }
- }
Angular 组件通信的三种方式的更多相关文章
- 黑马vue---56-58、vue组件创建的三种方式
黑马vue---56-58.vue组件创建的三种方式 一.总结 一句话总结: 不论是哪种方式创建出来的组件,组件的 template 属性指向的模板内容,必须有且只能有唯一的一个根元素 1.使用 Vu ...
- Vue组件之间通信的三种方式
最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...
- 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)
容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...
- vue组件通信的几种方式
最近用vue开发项目,记录一下vue组件间通信几种方式 第一种,父子组件通信 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child ...
- Vue自定义组件以及组件通信的几种方式
本帖子来源:小贤笔记 功能 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它 ...
- React: React组件创建的三种方式
一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...
- React中组件通信的几种方式
https://segmentfault.com/a/1190000012361461 需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...
- VC 线程间通信的三种方式
1.使用全局变量(窗体不适用) 实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通 ...
- 【转】VC 线程间通信的三种方式
原文网址:http://my.oschina.net/laopiao/blog/94728 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 ...
- 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 ...
- 折腾systemd-nspawn运行centos7
Archlinux创建Debian/Ubuntu的systemd-nspawn容器是很简单的,因为有debootstrap软件.某天我突然想装个centos7玩玩,搜了半天没发现有什么类似于deboo ...
- Spark中的两种模式
两种模式 client-了解 cluster模式-开发使用 操作 1.需要Yarn集群 2.历史服务器 3.提交任务的的客户端工具-spark-submit命令 4.待提交的spark任务/程序的字节 ...
- lua入门之环境搭建、第一个demo
前言 前段时间因为有些项目功能需要,自己研究了下lua,今天整理下,并以一个demo为示例演示 手机上的运行效果 分为几个步骤来逐步讲解. 1.lua介绍,为什么选择它? 2.环境安装 3.撸一个简单 ...
- 第三课 Dubbo设计中的设计模式
责任链模式 责任链模式在Dubbo中发挥的作用举足轻重,就像是Dubbo框架的骨架.Dubbo的调用链组织是用责任链模式串连起来的. 责任链中的每个节点实现Filter接口,然后由ProtocolF ...
- 4.ASCII码排序
描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之 ...
- java中static关键字的解析
静态的特点: A:随着类的加载而加载 B:优先于对象而存在 C:静态是被所有对象共享的数据 这也是我们来判断是否使用静态的标准 D:静态的出现,让我们的调用方式多了一种 类名.静态的内容 非静态的内容 ...
- [loj6278]数列分块入门2
做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...
- [loj3333]混合物
假设选择的调味瓶为$k_{1}<k_{2}<...<k_{s}$,即判定是否存在正有理数解$\{x_{1},x_{2},...,x_{s}\}$,满足$$(\sum_{i=1}^{s ...