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 somethingif (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 也發生了相應的變化。

這樣一來,我們的效果就實現了。

?

?

轉載于:https://www.cnblogs.com/eleven24/p/8409152.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255528.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV里IplImage的widthStep參數 和width參數

一直以為IplImage結構體中的widthStep元素大小等于width*nChannels&#xff0c;大錯特錯&#xff01;&#xff08;為了快速訪問&#xff0c;要內存對齊啊&#xff09;查看OpenCV2.1的源碼&#xff0c;在src/cxcore/cxarray.cpp文件中&#xff0c;找到cvInitImageHeader函數&…

【數字信號處理】——Python頻譜繪制

# -*- coding: utf-8 -*- from matplotlib import pyplotpyplot.rcParams[font.sans-serif] [SimHei] pyplot.rcParams[axes.unicode_minus] Falseimport numpy as np import matplotlib.pyplot as pl import matplotlib import math import randomN 500 # 繪制點總數 fs 5…

Android開發:《Gradle Recipes for Android》閱讀筆記1.3

想命令行執行gradle的構建&#xff0c;可以通過提供的gradle wrapper或者安裝gradle。 構建android項目不需要安裝gradle&#xff0c;因為android studio已經包含gradle。"gradle wrapper"指的是根目錄下的gradlew和gradlew.bat腳本&#xff08;結尾的w是wrapper的意…

pic

轉載于:https://www.cnblogs.com/edisonxiang/p/5392651.html

leetcode 643 Maximum Average Subarray I

題目詳情 Given an array consisting of n integers, find the contiguous subarray of given length k that has the maximum average value. And you need to output the maximum average value. 輸入一個數組nums和一個整數k。要求找出輸入數組中長度為k的子數組&#xff0c…

OpenCV之cvSmooth函數平滑濾波

1、cvSmooth函數用法 定義原型 <span style"font-size:12px;"> void cvSmooth( const CvArr* src, CvArr* dst,int smoothtypeCV_GAUSSIAN,int param1, int param2, double param3, double param4 );</span>src:輸入圖像. dst:輸出圖像. smoot…

【python數字信號處理】——DFT、DTFT(頻譜圖、幅度圖、相位圖)

目錄 一、離散時間傅里葉變換DTFT 二、離散傅里葉變換DFT 三、DFT與DTFT的關系 ? 參考&#xff1a; 《數字信號處理》——&#xff08;一&#xff09;.DTFT、DFT(python實現)_遠行者223的博客-CSDN博客python繪制頻譜圖DTFT&#xff0c;DFTpython繪制頻譜圖&#xff1a;…

ERROR:Tried to register widget id ==basemapGalleryDiv but that id is already registered解決辦法

在ArcGIS Server開發中&#xff0c;遇到DIV已經被注冊的情況&#xff0c;不能對原DIV內容進行更新。這里需要調用Dojo的destroyRecursive&#xff08;&#xff09;方法&#xff0c;逐個銷毀該Widget下的子元素及其后代元素。然后就可以在原DIV上注冊新的小部件。 示例代碼&…

通過Spring Data Neo4J操作您的圖形數據庫

在前面的一篇文章《圖形數據庫Neo4J簡介》中&#xff0c;我們已經對其內部所使用的各種機制進行了簡單地介紹。而在我們嘗試對Neo4J進行大版本升級時&#xff0c;我發現網絡上并沒有任何成型的樣例代碼以及簡介&#xff0c;而其自身的文檔也對如何使用Spring Data Neo4J介紹得語…

圖像金字塔

圖像金字塔被廣泛用于各種視覺應用中。圖像金字塔是一個圖像集合&#xff0c;集合中所有的圖像都源于同一個原始圖像&#xff0c;而且是通過對原始圖像連續降采樣活得&#xff0c;直到達到某個中止條件才停止降采樣。&#xff08;當然&#xff0c;降為一個像素肯定是中止條件。…

python使用git進行版本控制-分支管理

1、遠程克隆 最好的方式是先創建遠程庫&#xff0c;然后&#xff0c;從遠程庫克隆&#xff1a; 首先在github上創建一個新的倉庫&#xff0c;名字叫gitskills 我們勾選Initialize this repository with a README&#xff0c;這樣GitHub會自動為我們創建一個README.md文件。 下一…

【python數字信號處理】——Z變換

目錄 一、公式 二、代碼 三、結果 一、公式 頻域變量&#xff1a;z 時域變量&#xff1a;n 常見序列的Z變換&#xff1a;信號與系統復習歸納&#xff08;十一&#xff09;&#xff1a;Z變換例題_百把人的博客-CSDN博客_z變換例題基于東南大學陳從顏譯《信號、系統和變換》和…

九宮格拼圖 支持44 55等

代碼下載轉載于:https://www.cnblogs.com/ygcool/p/5395343.html

144. Binary Tree Preorder Traversal

Given a binary tree, return the preorder traversal of its nodes values. For example:Given binary tree {1,#,2,3}, 1\2/3return [1,2,3]. 該題是對樹做前序遍歷 下面分別是遞歸&#xff0c;非遞歸&#xff0c;分治三種思路的解題結果 #遞歸寫法 class Solution(object):d…

一體化點焊機將要取代分體式焊鉗在汽車制造生產線上的使用

目前大多數汽車制造廠及相關配套鈑金件廠家選用的是懸掛式點焊機及分體式焊鉗&#xff0c;從焊接變壓器的功率參數看&#xff0c;約70 % 為160KVA 的&#xff0c;約30 % 為200 kVA 的。原因主要有兩方面&#xff0c;一是新材料如鍍鋅鋼板、高強度鋼板、鋁合金板的應用&#xff…

【python數字信號處理】——線性卷積

目錄 一、公式概念 二、代碼 1、numpy庫 2、自定義打印出每一步結果 三、結果 一、公式概念 線性卷積_百度百科線性卷積(linear convolution) 在時域描述線性系統輸入和輸出之間關系的一種運算。這種運算在線性系統分析和信號處理中應用很多&#xff0c;通常簡稱卷積。中文…

activiti web流程設計器 整合視頻 教程 SSM和獨立部署的方式

本視頻為activiti工作流的web流程設計器整合視頻教程整合Acitiviti在線流程設計器(Activiti-Modeler 5.21.0 官方流程設計器&#xff09;本視頻共講了兩種整合方式1. 流程設計器和其它工作流項目分開部署的方式2. 流程設計器和SSM框架項目整合在一起的方式視頻大小 1.13 GB ~【…

移動端判斷橫屏豎屏

1. CSS判斷橫屏豎屏 寫在同一個CSS中 media screen and (orientation: portrait) {   /*豎屏 css*/} media screen and (orientation: landscape) and (min-width:450px){   /*橫屏 css*/}分開寫在2個CSS 豎屏<link rel"stylesheet" media"all and (orie…

第五章 - 圖像形態學 - 基于圖像金字塔的圖像分割(cvPyrSegmentation)

本例程涉及到幾個數據結構及方法&#xff0c;CvMemStorage、cvPyrSegmentation()、CvConnectedComp、cvGetSeqElem(). CvMemStorage CvMemStorage Growing memory storage typedef struct CvMemStorage { struct CvMemBlock* bottom;/* first allocated block */ struct CvM…

泛型參數轉換的問題

泛型不同參數類型生成的對象是相互獨立的。 //如 Tuple<string> ts; Tuple<object> to; //ts to 是兩個類型的對象。很多時候&#xff0c;我們希望實現 to ts 這種操作&#xff0c;為什么&#xff1f;因為看上去它應該如此。 為了達到這個目的&#xff0c;就要解決…