关于RxJS 自定义封装Rxbus的使用规范文档

相关RX文章请看:
SNS项目笔记<七>--深入探究RXjs
SNS项目笔记<四>--RXjs简要用法

1、封装的provider代码:

import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';
import { Subject } from "rxjs/Subject";
import { Observable } from 'rxjs/Observable';
import { ToastController } from 'ionic-angular';

/*
  Generated class for the Rxbus provider.

  See https://angular.io/docs/ts/latest/guide/dependency-injection.html
  for more info on providers and Angular DI.
*/
@Injectable()
export class Rxbus{

    private data: any; // 自定义bean 用来判断收发信息类型,隔离多事件重复问题
    private readonly subject: MySubject = MySubject.Instance //单例观察者

    constructor(){
         
    }
    /**
     * set监听
     * @param data 指定用于判断类型的bean 
     */
    setListener(data: any): void {
        this.data = data;
        this.subject.next(data);
    }
    /**
     * get监听对象
     */
    getListener(): Observable<any> {
        console.log(this.subject.observers);
        return this.subject.asObservable();
    }

    /**
     * 完成删除最后一个监听
     */
    compelete(){
        this.subject.finish()
    }
    /**
     * 完成清理所有监听
     */
    clear(){
        this.subject.clear()
    }
}


/**
 * 自定义观察者单例对象
 */
export class MySubject extends Subject<any> {
    public static readonly Instance: MySubject = new MySubject();
    
    private constructor(){
         super()
    }

    finish(){
        if (this.closed) {
            return
        }
        let len = this.observers.length;
        this.observers.splice(len-1,1);
    }

    clear(){
        if (this.closed) {
            return
        }
        this.observers.length = 0
    }
}

2、page页面使用说明:

2.1、使用准备:

  //判断是否是进入子页面操作,如果是则为true,不是则为false,默认为false
  isInner:boolean = false
  
  //页面构造中传入provider
  constructor(public rxbus: Rxbus){}
  

2.2、生命周期方法:

// 每次页面重新显示的时候都会调用
ionViewDidEnter() {
    this.isInner = false; // 判断是否进入子页面
}

// 页面每次成功加载后所调用的生命周期方法,在这个页面里面注册监听
ionViewDidLoad() {
    // 实例,不同类型和不同tag或者flag进行判断获取响应的监听结果
    this.rxbus.getListener().subscribe(data => {
      if (data instanceof RefreshTodo && data.tag == "uploadPhoto") {
        this.index = 1;
        this.isLoading = false;
        this.enable = true
        this.doNet(false)
      } else if (data instanceof RefreshTodo && data.tag == "refresh") {
        this.navCtrl.pop()
      } else if (data instanceof PopData && data.msg == "delete") {
        let photo = data.value
        this.deletePhoto(photo)
      } else if (data instanceof RefreshTodo && data.tag == "toUpdate") {
        let bean:AlbumBean = data.value
        this.albumName = bean.name
        this.bean.albumName = bean.name
        this.bean.logoUrl = bean.imgUrl
        this.bean.publicLevel = bean.permission
      }
    })

  }

//当页面不显示的时候使用该方法来删除本页面的监听,进入子页面则不应该删除监听
 ionViewDidLeave() {
    if (!this.isInner) {
      this.rxbus.compelete()
    }
  }

2.3、声明isInner为true的情况:
主要是在push页面之前,即进入子页面:

    onClick($event){
        this.isInner = true
        this.nav.push(myChildPage)
    }

3、其他注意事项:

3.1、关于RXjs封装说明:由于源代码中仅通过叠加observer来创建监听者,并没有通过map或者类似于对象来储存所以必须在注册过后删掉以保持单例。
3.2、必须用不同的对象或者不同的tag以及value来区分所对应的监听,不然会出现重复监听情况。
3.3、必须在子页面(除了首页)删掉对应的监听,不然绝对会出现重复监听情况。
3.4、由于源码的局限性,重复监听与删除监听必须同步进行。
3.5、如果该页面有popWindow或者alert子页面以及modal页面的情况下,不能够使isInner变为true,不然会让监听无法删除,子页面的所有UI元素窗口没有走生命周期方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 《百合花开,无限美好——遥想予她》 “莫名我就喜欢你”第一句入耳,便是不容置疑的喜好,且很难忘却。虽一早比一世遥远...
    于路阅读 773评论 0 0
  • 2017年暑假开始了,和三、四个同学拉起行李来闯一闯未知的世界。 几个意志左右摇摆的小姑娘找了一...
    大梦L阅读 279评论 0 0
  • 吃饭的时候她一直在给我讲笑话,我突然想起一件事,就一脸认真的说:我要跟你说件事。她吓了一跳,然后调侃到,怎么了?你...
    多肉丝阅读 88评论 0 0
  • 清明小假,回了一趟家!想着在大学城那边吃的土豆泥挺好吃的,于是尝试着做了一下! 原料:4颗土豆,半个洋葱,1根胡萝...
    吖吖呀呀呀阅读 252评论 0 4