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 ... 
随机推荐
- 001 -js对时间日期的排序
			001-JS对时间日期的排序 最近在做公司的项目时间,产品给了一个很简单的页面,让帮忙写一下.首先看一下产品的需求: 需要对该列表进行排序 思路:(1)可以在数据库写sql语句的时间直接一个DESC按 ... 
- HBASE理论篇
			1.Hbase是什么 HBase是一种构建在HDFS之上的分布式.面向列的存储系统.在需要实时读写.随机访问超大规模数据集时,可以使用HBase. 尽管已经有许多数据存储和访问的策略和实现方法,但事实 ... 
- 关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法
			在<JavaScript高级程序设计>这本书中有这样一段话:有很多开发人员错误的认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的.换句话说,尼古拉认为当一个 ... 
- 6. B树
			一.B 树是一种多叉平衡查找树 相较于二叉结构的红黑树,B 树是多叉结构,所以在元素数量非常多的情况下,B 树的高度不会像二叉树那么大,从而保证查询效率. 一棵含 n 个结点的 B 树的高度 h = ... 
- 大学网站UI设计分析(以学校领导/历届领导为例)
			第一次的冲刺阶段让我过了一把PM的瘾,第一阶段的冲刺完成以后第一感觉就是PM不好当,在大学里做个课程设计当个PM相对而言还是比较容易的,但是我明白,当我们走向工作岗位以后,面临的情况会比学校的情况的复 ... 
- Java 成员初始化顺序
			package com.cwcec.test; class Fu { int num = 5; //构造代码块 { System.out.println("Fu constructor co ... 
- QSet使用及Qt自定义类型使用QHash等算法
			版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSet使用及Qt自定义类型使用QHash等算法 本文地址:http://techie ... 
- php反射机制应用
			用来获取指定的类的信息,包括类中的属性,方法,方法权限,注释等 用途:1.thinkPHP框架中的前置,后置控制器的实现 2.与debug_backtrace函数结合使用,文件调用的权限管理 使用方法 ... 
- JS扫雷原理性代码
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- android Eclipse there no select
			点mainactivity类 右键 run as 进行 配置 就可运行 
