• [转]ionic2+Angular 依赖注入之Subject ——使用Subject来实现组件之间的通信


    转自: 

    https://www.cnblogs.com/tomboyxiao/p/7550646.html

    在Angular+ionic2 开发过程中,我们不难发现,页面之间跳转之后返回时是不会刷新数据的。

    场景一:当前页面需要登录之后才能获取数据——去登录,登录成功之后返回——页面需要手动刷新才能获取到数据。

    场景二:当前正在浏览地址列表——选择添加或者更改现有地址,保存成功之后——返回列表,页面数据不是最新的数据。

    ……

    实现需求:一旦用户登录成功,列表数据发生变化……就通知相关的组件,主动去获取最新的数据。

    类似的场景有很多,在Angular开发中我们就需要使用Subject来实现组件之间的通信。

    step1:创建主题对象。为了便于维护和管理,我把项目中需要通信的对象统一声明在一个文件中。

    复制代码
    import { UserModel } from '../model-res/user-model';
    import { Subject } from "rxjs/Rx";
    export const AppOnChangeSunject = {
        UserOnChange: new Subject<UserModel>(),//订阅用户登录状态的变化
        OrderAddressOnChange:new Subject<any>(),//订阅订单地址是否发生改变
        AddressListOnChange:new Subject<any>(),//订阅地址列表数据的更新
    }
    复制代码

    step2:在相关的数据更新接口中调用next()方法,通知相关的订阅者已经接受到新的信息,以地址列表为例。

    复制代码
    import { Injectable } from '@angular/core';
    import { Http } from '@angular/http';
    
    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/catch';
    import { URLService } from '../../common/urls';
    import { EditAddressModel } from '../../model-req/edit-address-model';
    import { AppOnChangeSunject } from '../../common/change-subject';
    
    @Injectable()
    export class JfAddressService {
    
        constructor(private http: Http, private us: URLService) { }
    
        getUserAddress(): Observable<any> {
            let url = this.us.getUrl('yxt_getUserAddress')
            return this.http.get(url).map(res => res.json().data);
        }
    
        deleteUserAddress(obj): Observable<any> {
            // 删除地址
            let url = this.us.getUrl('yxt_deleteUserAddress', obj);
            return this.http.delete(url, obj).map(res => {
                AppOnChangeSunject.AddressListOnChange.next(200);
                return res.json();
            })
        }
    
        editUserAddress(obj: EditAddressModel): Observable<any> {
            // 编辑更新地址
            let url = this.us.getUrl('yxt_editUserAddress', obj);
            var data = this.us.objectToUrlParams(obj);
            return this.http.put(url, data).map(res => {
                AppOnChangeSunject.AddressListOnChange.next(200);
                return res.json();
            })
        }
    
        addUserAddress(obj: EditAddressModel): Observable<any> {
            // 添加地址
            let url = this.us.getUrl('yxt_addUserAddress', obj);
            var data = this.us.objectToUrlParams(obj);
            return this.http.post(url, data).map(res => {
                AppOnChangeSunject.AddressListOnChange.next(200);
                return res.json();
            })
        }
    
        setUserDefaultAddress(obj):Observable<any>{
            // 设为默认地址
            let url=this.us.getUrl('yxt_setUserDefaultAddress',obj);
            return this.http.post(url,null).map(res=>{
                AppOnChangeSunject.AddressListOnChange.next(200);
                return res.json();
            })
        }
    
    }
    复制代码

     以上的所有操作都会让地址列表的数据发生变化,所以在操作完相关操作之后需要发出通知。

    step3:在地址列表组件中添加订阅。

    复制代码
    import { Component, OnInit } from '@angular/core';
    import { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular';
    import { JfAddressService } from '../jf-address.service';
    import { AppOnChangeSunject } from '../../../common/change-subject';
    import { MsgBarService } from '../../../common/msg-bar';
    import { MainPage } from '../../../common/main';
    import { WechatService } from '../../../common/wechat.service';
    
    
    @IonicPage({
      name: 'jfAddress',
      segment: 'jfAddress/:p0',
      defaultHistory:['usercenter']
    })
    @Component({
      selector: 'page-jf-address',
      templateUrl: 'jf-address.html',
    })
    //p0订单已选地址
    export class JfAddressPage extends MainPage implements OnInit {
      addresses: any[];
      currentAddress;
      constructor(
        public navCtrl: NavController,
        public navParams: NavParams,
        private service: JfAddressService,
        private alertCtrl: AlertController,
        private ms: MsgBarService,
        public wechat: WechatService) {
          super(wechat);
        this.currentAddress = navParams.data.p0 || '';
        AppOnChangeSunject.AddressListOnChange.subscribe(res => {
          if (res == 200) {
            this.getUserAddress();//重新获取最新的数据
          }
        })
    
      }
      ngOnInit() {
        this.getUserAddress();
      }
    
      getUserAddress(e?) {
        this.service.getUserAddress().subscribe(res => {
          if (res.addressWsDTOList) {
            this.addresses = res.addressWsDTOList;
          }
          if (e) { e.complete(); }
        },()=>{
          if (e) { e.complete(); }
        })
      }
    }
    复制代码
  • 相关阅读:
    VestaCP中国用户遭到大量DDOS攻击
    ZooKeeper设置ACL权限控制
    linux rsync 指定用户名和密码的方式同步
    关于Apache HTTPD 2.2.15的部分漏洞修复建议
    AutoMapper官方文档(二)【升级指南】
    openssl升级
    MongoDB如何无缝版本升级
    mysql在线升级更新步骤
    手动升级kubernetes集群
    更新Docker容器
  • 原文地址:https://www.cnblogs.com/MrGrz/p/12745252.html
Copyright © 2020-2023  润新知