A simple store implemenet:

  1. import { Observable } from 'rxjs/Observable';
  2. import { BehaviorSubject } from 'rxjs/BehaviorSubject';
  3.  
  4. import 'rxjs/add/operator/pluck';
  5. import 'rxjs/add/operator/distinctUntilChanged';
  6. import {User} from './auth/shared/services/auth/auth.service';
  7.  
  8. export interface State {
  9. user: User;
  10. [key: string]: any
  11. }
  12.  
  13. const state: State = {
  14. user: undefined
  15. };
  16.  
  17. export class Store {
  18.  
  19. private subject = new BehaviorSubject<State>(state);
  20. private store = this.subject.asObservable().distinctUntilChanged();
  21.  
  22. get value() {
  23. return this.subject.value;
  24. }
  25.  
  26. select<T>(name: string): Observable<T> {
  27. return this.store.pluck(name);
  28. }
  29.  
  30. set(name: string, state: any) {
  31. this.subject.next({ ...this.value, [name]: state });
  32. }
  33.  
  34. }

Using this store in AuthService:

  1. import {Injectable} from '@angular/core';
  2. import {AngularFireAuth} from 'angularfire2/auth';
  3. import {Store} from 'store';
  4.  
  5. import 'rxjs/add/operator/do';
  6.  
  7. export interface User {
  8. uid: string;
  9. email: string;
  10. authenticated: boolean;
  11. }
  12.  
  13. @Injectable()
  14. export class AuthService {
  15.  
  16. // handle on every auth state changes
  17. auth$ = this.af.authState
  18. .do(next => {
  19. if (!next) {
  20. this.store.set('user', null);
  21. return;
  22. }
  23. const user = {
  24. email: next.email,
  25. uid: next.uid,
  26. authenticated: true
  27. };
  28. this.store.set('user', user);
  29. });
  30.  
  31. constructor(
  32. private af: AngularFireAuth,
  33. private store: Store
  34. ) {
  35.  
  36. }
  37.  
  38. createUser(email: string, password: string) {
  39. return this.af.auth.createUserWithEmailAndPassword(email, password);
  40. }
  41.  
  42. loginUser(email: string, password: string) {
  43. return this.af.auth.signInWithEmailAndPassword(email, password)
  44. }
  45. }

Using Reactive approach in app.component.ts:

  1. import {Component, OnDestroy, OnInit} from '@angular/core';
  2. import {Store} from 'store';
  3. import {AuthService} from '../../../auth/shared/services/auth/auth.service';
  4.  
  5. import {Observable} from 'rxjs/Observable';
  6. import {Subscription} from 'rxjs/Subscription';
  7. import {User} from 'firebase/app';
  8.  
  9. @Component({
  10. selector: 'app-root',
  11. styleUrls: ['app.component.scss'],
  12. template: `
  13. <div>
  14. <h1>{{user$ | async | json}}</h1>
  15. <div class="wrapper">
  16. <router-outlet></router-outlet>
  17. </div>
  18. </div>
  19. `
  20. })
  21. export class AppComponent implements OnInit, OnDestroy{
  22.  
  23. user$: Observable<User>;
  24. subscription: Subscription;
  25.  
  26. constructor(
  27. private store: Store,
  28. private authService: AuthService
  29. ) {}
  30.  
  31. ngOnInit() {
  32. this.subscription = this.authService.auth$.subscribe();
  33. this.user$ = this.store.select<User>('user');
  34. }
  35.  
  36. ngOnDestroy() {
  37. this.subscription.unsubscribe();
  38. }
  39. }

[Angular] Reactive Store and AngularFire Observables的更多相关文章

  1. angular reactive form

    这篇文章讲了angular reactive form, 这里是angular file upload 组件 https://malcoded.com/posts/angular-file-uploa ...

  2. [Angular] Reactive Form -- FormControl & formControlName, FormGroup, formGroup & formGroupName

    First time dealing with Reactive form might be a little bit hard to understand. I have used Angular- ...

  3. Angular Reactive Form-响应式表单验证

    内建验证规则 Angular中提供了一些內建的Validators,这些验证规则可以在Template-Driven或Reactive表单中使用. 目前 Angular 支持的内建 validator ...

  4. Angular Reactive Forms -- Model-Driven Forms响应式表单

    Angular 4.x 中有两种表单: Template-Driven Forms - 模板驱动式表单 (类似于 AngularJS 1.x 中的表单 )  官方文档:https://v2.angul ...

  5. Angular Reactive Form - 填充表单模型

    setValue 使用setValue,可以通过传递其属性与FormGroup后面的表单模型完全匹配的数据对象来一次分配每个表单控件值. 在分配任何表单控件值之前,setValue方法会彻底检查数据对 ...

  6. 手把手教你用ngrx管理Angular状态

    本文将与你一起探讨如何用不可变数据储存的方式进行Angular应用的状态管理 :ngrx/store——Angular的响应式Redux.本文将会完成一个小型简单的Angular应用,最终代码可以在这 ...

  7. angular版聊天室|仿微信界面IM聊天|NG2+Node聊天实例

    一.项目介绍 运用angular+angular-cli+angular-router+ngrx/store+rxjs+webpack+node+wcPop等技术实现开发的仿微信angular版聊天室 ...

  8. 2015,2016 Open Source Yearbook

    https://opensource.com/yearbook/2015 The 2015 Open Source Yearbook is a community-contributed collec ...

  9. [AngularJS Ng-redux] Integrate ngRedux

    Up to this point, we have created an effective, yet rudimentary, implementation of Redux by manually ...

随机推荐

  1. 【shell学习】经常使用条件推断-字符,数字,文件

    IF 推断 之前也写过简单的shell脚本,也不是转职运维.和系统相关的工作比較少.所以不怎么熟练. 近期因为系统总是出现各种乱七八糟的问题,也没有人来协助.仅仅好自己写shell脚本了,都是些基础的 ...

  2. 5.brackets 快捷键 有大用

    转自:https://blog.csdn.net/u012011360/article/details/41209223 ctrl+b 当选中一个文本时,会出现相同的文本,被高亮显示 按ctrl+b ...

  3. Mahout的推荐系统

    Mahout的推荐系统 什么是推荐系统 为什使用推荐系统 推荐系统中的算法 什么是推荐系统 为什么使用推荐系统? 促进厂商商品销售,帮助用户找到想要的商品 推荐系统无处不在,体现在生活的各个方面 图书 ...

  4. Cisco Works 2000 网络管理软件安装、配置全过程

    下面是在windows 2000 server 下安装ciscoworks 2000的过程.(附件中是标准avi格式文件,由于上传附件大小限制,更多内容见Sina播客) 浏览全部原创视频请见: htt ...

  5. Kinect 开发 —— 开发前的准备工作

    Kinect SDK v1.5 支持托管语言和非托管语言 Xbox360的游戏是基于Xbox360开发工具包 (XDK)开发的,Xbox 360和Windows是两个完全不同的系统架构.使用Kinec ...

  6. 初识Oracle中的正则表达式

    Oracle使用正则表达式离不开这4个函数: 1.regexp_like 2.regexp_substr 3.regexp_instr 4.regexp_replace  

  7. 使用Vue动态生成form表单

    form-create 表单生成器 具有数据收集.校验和提交功能的表单生成器,支持双向数据绑定和事件扩展,组件包含有复选框.单选框.输入框.下拉选择框等表单元素以及省市区三级联动,时间选择,日期选择, ...

  8. Myeclipse学习总结(3)——Myeclipse中的代码格式化、注释模板及保存时自动格式化

    设置Myeclipse中的代码格式化.注释模板及保存时自动格式化 1:设置注释的模板: 下载此模板:  codetemplates.xml This XML file does not appear ...

  9. _00018 Hadoop-2.2.0 + Hbase-0.96.2 + Hive-0.13.1 分布式环境整合,Hadoop-2.X使用HA方式

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最 ...

  10. BZOJ1195: [HNOI2006]最短母串(Trie图,搜索)

    Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...