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 监听同级兄弟组件数据变化的更多相关文章

  1. 监听localStorage中的数据变化

    问题描述:我们在js里面获取了某一个localstorage的值,但是后期它可能改变了,我们js只执行一遍没办法再次获取它的值,当然可以刷新页面获取,但如果是我们的但页面就不能刷新页面了,此时:我们可 ...

  2. Vue (表单、斗篷、条件、循环指令,分隔符成员、计算属性成员、属性的监听、vue组件、子组件、各个常见的钩子函数)

    表单指令 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...

  3. Android监听系统短信数据库变化-提取短信内容

    由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路. Android监听系统短信数据库内容变化使用场景: 1.监听短信数据库的 ...

  4. iOS: 使用KVO监听控制器中数组的变化

    一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...

  5. js监听输入框值的即时变化onpropertychange、oninput

    js监听输入框值的即时变化onpropertychange.oninput 很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感. // //   要达到的效果 ...

  6. vue 如何在循环中 "监听" 的绑定v-model数据

    vue 如何在循环中 "监听" 的绑定v-model数据 阅读目录 vue 如何在循环中 "监听" 的绑定v-model数据 1. 普通属性的值进行监听 2. ...

  7. 监听INPUT值的即时变化

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. asp.net,监听输入框值的即时变化onpropertychange、oninput

    作者:自由天堂发布站点:WEB六零零 网页设计制作原文地址:http://www.web600.net/html/editor/JavaScript/201001131529.html 要达到的效果 ...

  9. 怎样监听xhr.readyState值的变化

    可以使用 xhr.onreadystatechange 属性指向的函数去监听 xhr.readyState 值的变化. 示例如下: var xhr = new XMLHttpRequest(); xh ...

随机推荐

  1. Ubuntu18.04重装指南

    Guide google chrome sougou 谷歌服务助手\(\rightarrow\)谷歌访问助手(谷歌应用商店)登录谷歌账号(cnyalitea@gmail.com)然后同步. \(\te ...

  2. Serverless 架构的优点和缺点

    Serverless 的优势 在我使用 Serverless Framework 开发 AWS Serverless 应用的过程中,最方便的莫过于,第一次部署和第二次.第三次部署没有什么区别.只需要执 ...

  3. Knight Moves(广搜BFS)

    Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to ...

  4. 2018软工实践—Alpha冲刺(5)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助测试的进行 测试项目运行的服务器环境 ...

  5. 软工实践Beta冲刺答辩

    福大软工 · 第十二次作业 - Beta答辩总结 组长本次博客作业链接 项目宣传视频链接 本组成员 1 . 队长:白晨曦 031602101 2 . 队员:蔡子阳 031602102 3 . 队员:陈 ...

  6. 今目标登录时报网络错误E110

    今目标登录的时候报错了,错误代码:E110不论怎么修改都修复不了,百度相关资料也没有,只能联系客服. 经过好久终于联系上了客服,客服给出的解决方案是修改:Enternet选项: 第一步:打开,控制面板 ...

  7. [Prism框架实用分享]如何在Prism应用程序中使用日志

    前言 在Prism中有关日志的命名空间: Microsoft.Practices.Prism.Logging 在Prism中,你可以使用Prism自带的Logger(比如TextLogger等),也可 ...

  8. 使用qemu-img创建虚拟磁盘文件

    # 安装qemu-img yum install -y qemu-img   # 获取帮助 qemu-img --help   # 支持的虚拟磁盘文件格式 Supported formats: vvf ...

  9. Alpha阶段敏捷冲刺 DAY5

    一.举行站立式例会 1.今天我们利用晚上的时间开展了站立会议,总结了一下之前工作的问题,并且制定了明天的计划. 2.站立式会议照片 二.团队报告 1.昨日已完成的工作 (1)改进了程序算法 (2)优化 ...

  10. laravel获取当前认证用户登录

    可以通过Auth门面访问认证用户: 要在方法上面声明 use Auth: 获取当前认证用户使用 $user = Auth::user(); 获取用户认证ID $id = Auth::id;