angular 使用rxjs 监听同级兄弟组件数据变化
angular 的官网给出了父子组件之间数据交互的方法,如ViewChild、EventEmitter
但是如果要在同级组件之间进行数据同步,似乎并没有给出太多的信息。
有时候我们想,在一个组件中修改数据之后,马上反映到另外一个组件中, 或者可能需要调用另外一个组件中的方法,这时候,我们就可以借助于 rxjs 了。
下面源码在 https://github.com/eleven26/angular-observer
1、首先,我们定义一个用于在应用内进行数据交互的 service
import {Injectable} from '@angular/core';
@Injectable()
export class StoreService {
public storageObj = {};
set(key, value) {
this.storageObj[key] = value;
}
get(key) {
return this.storageObj[key];
}
remove(key) {
delete this.storageObj[key]
}
}
2、我们在需要监听数据变化的组件中加入以下代码,此处是直接写在了 AppComponent 中
import {Component, OnInit} from '@angular/core';
import {StoreService} from './store.service';
import {Observable} from 'rxjs/Observable';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
title = 'app works!';
constructor(private storeService: StoreService) {}
ngOnInit() {
let myObserver: Observable<any> = Observable.create((observer) => {
// payload 用以存放不同组件之间需要交互的数据
let payload = this.storeService.get('payload');
if (payload) {
// do something
if (payload['type'] == 'set-title') {
this.title = payload['title'];
}
this.storeService.remove('payload');
}
observer.next();
});
// 保存到公共 service 中,以便不同组件之间可以使用同一个观察者对象
this.storeService.set('myObserver', myObserver);
}
}
上面的代码中,我们定义了一个可观察对象 myObserver,我们在此方法上调用 subscribe 的时候,Observable.create 的回调就会被调用,
然后,我们从 StoreSrevice 中取得需要处理的数据,具体数据格式自由规定,
我们处理完数据之后,把相关数据从 StoreSrevice 中移除
同时,我们需要把 myObserver 保存到 StoreService 中,以便不同组件获取到的是同一个 observer。
3、定义一个 A 组件,用来生产 payload,类似于 生产者-消费者
import {Component, OnInit} from '@angular/core';
import {StoreService} from './store.service';
import {Observable} from 'rxjs/Observable';
@Component({
selector: 'a-component',
template: `
<h1>A Component'title: {{title}}</h1>
<input type="text" (keyup)="change($event.target.value)">
`,
styles: []
})
export class AComponent implements OnInit{
title = 'a title';
public myObserver: Observable<any>;
constructor(private storeService: StoreService) {}
ngOnInit() {
this.myObserver = this.storeService.get('myObserver');
}
change(new_title) {
this.title = new_title;
this.storeService.set('payload', {
type: 'set-title',
title: new_title
});
this.myObserver.subscribe(() => {});
}
}
我们在该组件输入 title 的时候,发现 AppComponent 的 title 也发生了相应的变化。
这样一来,我们的效果就实现了。

angular 使用rxjs 监听同级兄弟组件数据变化的更多相关文章
- 监听localStorage中的数据变化
问题描述:我们在js里面获取了某一个localstorage的值,但是后期它可能改变了,我们js只执行一遍没办法再次获取它的值,当然可以刷新页面获取,但如果是我们的但页面就不能刷新页面了,此时:我们可 ...
- Vue (表单、斗篷、条件、循环指令,分隔符成员、计算属性成员、属性的监听、vue组件、子组件、各个常见的钩子函数)
表单指令 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...
- Android监听系统短信数据库变化-提取短信内容
由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路. Android监听系统短信数据库内容变化使用场景: 1.监听短信数据库的 ...
- iOS: 使用KVO监听控制器中数组的变化
一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...
- js监听输入框值的即时变化onpropertychange、oninput
js监听输入框值的即时变化onpropertychange.oninput 很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感. // // 要达到的效果 ...
- vue 如何在循环中 "监听" 的绑定v-model数据
vue 如何在循环中 "监听" 的绑定v-model数据 阅读目录 vue 如何在循环中 "监听" 的绑定v-model数据 1. 普通属性的值进行监听 2. ...
- 监听INPUT值的即时变化
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- asp.net,监听输入框值的即时变化onpropertychange、oninput
作者:自由天堂发布站点:WEB六零零 网页设计制作原文地址:http://www.web600.net/html/editor/JavaScript/201001131529.html 要达到的效果 ...
- 怎样监听xhr.readyState值的变化
可以使用 xhr.onreadystatechange 属性指向的函数去监听 xhr.readyState 值的变化. 示例如下: var xhr = new XMLHttpRequest(); xh ...
随机推荐
- CMDBuild2.4.3安装配置
参考文档: 官网:http://www.cmdbuild.org/en 参考:http://blog.csdn.net/shawn210/article/details/70230248 本文涉及CM ...
- [转载]linux+nginx+python+mysql安装文档
原文地址:linux+nginx+python+mysql安装文档作者:oracletom # 开发包(如果centos没有安装数据库服务,那么要安装下面的mysql开发包) MySQL-devel- ...
- Apriori 获取关联规则实现
前言 自己的一个Apriori 获取关联规则的python实现.具体原理不讲,代码添加了说明,还是很好理解的. 数据预处理 #最小置信度 min_conf = 0.5 #最小支持度 min_sup = ...
- Tim Cook在电话会议上宣布,Burberry前CEO Angela Ahrendts将在下周加入苹果
在今天的第二季度财报电话会议上,苹果公司的 CEO Tim Cook 宣布 Burberry 的前 CEO Angela Ahrendts 将在下周入职苹果,出任苹果负责零售和网上商店的高级副总裁. ...
- 关于解决MySort
关于解决MySort 那天老师教给我们关于sort的用法以及String类中的split方法.在一定程度上告诉我们sort用法的原理和一些特别的用法后,老师叫我们用JAVA尝试去设计一个"M ...
- c# 免费版pdf转word尝试
链接:https://pan.baidu.com/s/1Dwuezo6YGe9CdlSyrwQyNg 密码:c81a 1.安装此程序 2.在安装文件的bin下拷贝dll: 3.代码引用 private ...
- 第一个scrum会议
第一阶段冲刺任务认领: PM薛哥: 让手电筒亮起来 梁哥: 代码测试 康哥: 用户反馈等等
- python、Eclipse、pydev环境配置
转载来源:http://www.cnblogs.com/Bonker/p/3584707.html 编辑器: Eclipse + pydev插件: 1. Eclipse是写JAVA的IDE, 这样就可 ...
- gmssl
一.安装 1.1 github地址 1.2 官网地址 由于我本地虚拟机跑的是centos,按照官网的安装步骤,没有安装成功.后来使用github上提供的安装步骤完美编译安装成功. 二.使用 由于gms ...
- JavaScript DOM编程艺术学习笔记-第二章JavaScript语法
一.JavaScript示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...