Angular 发布订阅模式实现不同组件之间通讯
在我们项目中要实现不同组件之间通讯,Angular的@Input和@Output只能实现有父子组件的限制,如果是复杂跨组件实现不同组件可以通过共享变量的方式实现,比如这个博客的思路:https://www.cnblogs.com/hlkawa/p/6815023.html,或者是基于h5的 localStorage + 轮询机制实现,不过现在以发布订阅的模式来实现不同组件之间的通讯会更加简洁,直接贴代码:
Service服务创建主题
#注意angular5和angular6以上的版本可能Subject和Observable引入的路径有所不同
import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/observable'; export class MessageService {
private subject = new Subject<any>(); send(message: any) {
this.subject.next(message);
} get(): Observable<any> {
return this.subject.asObservable();
}
}
发布者 组件
import { Component, OnInit } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { MessageService } from '../../service/message.service';
@Component({
selector: 'app-send-demo',
templateUrl: './send-demo.component.html',
styleUrls: ['./send-demo.component.sass']
})
export class SendDemoComponent implements OnInit {public name = 'ok';
constructor(public srv: MessageService) { }
ngOnInit() {
}
clickBtn() {
this.srv.send(this.name);
}
}
消费者组件
import { Component, OnInit } from '@angular/core';
import { MessageService } from '../../service/message.service';
@Component({
selector: 'app-subscribe-home',
templateUrl: './subscribe-home.component.html',
styleUrls: ['./subscribe-home.component.sass']
})
export class SubscribeHomeComponent implements OnInit {
constructor(public srv: MessageService) { }
public message = '';
ngOnInit() {
this.srv.get().subscribe((result) => {this.message = result;
console.log(this.message);
});
}
}
但是上面基于Subject的方式,有一个问题,就是在消息发布者发送多次消息,消息消费者累计式的接受消息,出现资源的浪费。如果我们消费每次消费只想消费最新一条消息可以使用Subject的变体之一是BehaviorSubject,具有“当前值”的概念。它存储发布给消费者的最新值,每当新的Observer订阅时,它将立即从BehaviorSubject中获得“当前值” 。
相关的伪代码如下:
// 定义 BehaviorSubject
public bolg: Blog;
private blogSubject = new BehaviorSubject<Blog>(this.bolg); sendBlog(blog:Blog) {
this.blogSubject.next(blog);
} getBlog(): Blog {
return this.blogSubject.getValue()
}
--------------------------------------------------------- // 提供者
this.blogService.sendBlog(blog);
---------------------------------------------------------- // 消费者
this.blog = this.blogService.getBlog();
Angular 发布订阅模式实现不同组件之间通讯的更多相关文章
- 观察者模式 vs 发布-订阅模式
我曾经在面试中被问道,_“观察者模式和发布订阅模式的有什么区别?” _我迅速回忆起“Head First设计模式”那本书: 发布 + 订阅 = 观察者模式 “我知道了,我知道了,别想骗我” 我微笑着回 ...
- 《JavaScript设计模式与开发实践》-- 发布-订阅模式
详情个人博客:https://shengchangwei.github.io/js-shejimoshi-fabudingyue/ 发布-订阅模式 1.定义 发布-订阅模式:发布-订阅模式又叫观察者模 ...
- js设计模式之发布订阅模式
1. 定义 发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知. 订阅者(Subscriber)把自己想订阅的事件注册(Subscri ...
- JavaScript设计模式_05_发布订阅模式
发布-订阅模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都将得到通知.发布-订阅模式是使用比较广泛的一种模式,尤其是在异步编程中. /* * pre:发布-订阅 ...
- javascript设计模式——发布订阅模式
前面的话 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模 ...
- 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式
第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...
- js设计模式之发布/订阅模式模式
一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...
- js设计模式-发布/订阅模式
一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...
- [转]js设计模式—发布订阅模式
发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模式.本文将 ...
随机推荐
- 像素迷踪,当Unity的Frame Debugger力不从心时
http://www.manew.com/thread-92382-1-1.html 从版本5开始,Unity包含了一个全新的可视化帧调试工具,Frame Debugger.该工具能帮你解决很多图形方 ...
- LOJ2434. 「ZJOI2018」历史 [LCT]
LOJ 思路 第一眼看似乎没有什么思路,试着套个DP上去:设\(dp_x\)表示只考虑\(x\)子树,能得到的最大答案. 合并的时候发现只有\(x\)这个点有可能做出新的贡献,而做出新贡献的时候必然是 ...
- C++ 如何进阶?
1.C++的用途和意义 总体来说,C++作为一门软件开发语言,它的流行度是在减少的.主要原因在于语言的复杂和灵活导致软件开发成本提高,这体现在开发周期和人力上.它不适用于startup公司的快速开发, ...
- 坑:pytest 运行报错unknown hook 'pytest_namespace' in plugin <module 'allure.pytest_plugin'
右键运行pytest run时报错,原因是pytest版本过高导致的.有时候会遇到在自己本机没问题,拉取服务器代码下来后就出问题了,所以把pytest版本改低就可以,亲测有效,希望对你有帮助 完整报错 ...
- Java 按字节计算字符串的长度
在<从后向前截取指定长度的字符串>中介绍了如何截取字符串,本文介绍如何统计字符串的字节长度. import org.slf4j.Logger; import org.slf4j.Lo ...
- D2. Remove the Substring (hard version)(思维 )
D2. Remove the Substring (hard version) time limit per test 2 seconds memory limit per test 256 mega ...
- abp zero bug
web host 项目中ChatController GetUploadedObject 使用:using (CurrentUnitOfWork.SetTenantId(null)) 图片刷新出错,改 ...
- Java设计模式之二工厂模式
在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...
- linux10.日志服务器建立和克隆机的网卡问题
日志服务器建立 克隆虚拟机网卡混乱问题处理 vim /etc/udev/rules.d/70-perisistent-net.rules 调整mac地址与设备的对应关系 ...
- 制作 python解释器
https://www.zhihu.com/tardis/sogou/qus/27286136