在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(); }
})
}
}

over!

ionic2+Angular 依赖注入之Subject ——使用Subject来实现组件之间的通信的更多相关文章

  1. Angular依赖注入详解

    Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...

  2. 30行代码让你理解angular依赖注入:angular 依赖注入原理

    依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...

  3. angular 依赖注入原理

    依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...

  4. [译] 关于 Angular 依赖注入你需要知道的

    如果你之前没有深入了解 Angular 依赖注入系统,那你现在可能认为 Angular 程序内的根注入器包含所有合并的服务提供商,每一个组件都有它自己的注入器,延迟加载模块有它自己的注入器. 但是,仅 ...

  5. Angular依赖注入:全面讲解(翻译中)

    在实际使用Angular依赖注入系统时,你需要知道的一切都在本文中.我们将以实用易懂并附带示例的形式解释它的所有高级概念. Angular最强大.最独特的功能之一就是它内置的依赖注入系统. 大多数时候 ...

  6. 理论+案例,带你掌握Angular依赖注入模式的应用

    摘要:介绍了Angular中依赖注入是如何查找依赖,如何配置提供商,如何用限定和过滤作用的装饰器拿到想要的实例,进一步通过N个案例分析如何结合依赖注入的知识点来解决开发编程中会遇到的问题. 本文分享自 ...

  7. angular 依赖注入

    依赖注入    依赖注入(DI)是一个经典的设计模式, 主要是用来处理组件如何获得依赖的问题.关于DI,推荐阅读Martin Flower的文章(http://martinfowler.com/art ...

  8. angular依赖注入的理解(转)

    使用过java进行开发的人肯定知道大名鼎鼎的spring框架,对于spring的IOC肯定也有所了解,通过配置文件定义好bean之后,如果需要使用这些bean,不需要自己去实例化,而是跟spring这 ...

  9. angular依赖注入(2)——注入器的使用

    一.显示注入器 injector = ReflectiveInjector.resolveAndCreate([Car, Engine, Tires]); let car = injector.get ...

随机推荐

  1. git常见操作

    本地仓库关联远程仓库 新建本地目录scala git init 这样就新建了一个本地仓库 在远端如github上新建仓库scala 关联远程仓库 git remote add origin git@g ...

  2. GitHub上传文件或项目的教程

    既然是往GitHub上传文件,那GitHub账号必须得有,这时候就会有同学问:妖怪吧,我没有GitHub账号怎么办? 别急别急,打开GitHub网站https://github.com/,然后注册就O ...

  3. Laravel5中使用阿里大于(鱼)发送短信验证码

    在做用户注册和个人中心的安全管理时,我实现借助第三方短信平台(阿里大于(鱼))在Laravel框架中进行手机验证的设置:阿里大于,是阿里通信旗下优质便捷的云通信服务平台,整合了三大运营商的通信能力,为 ...

  4. 再叙Java反射

    Java中的反射 本文为反射的基础知识部分. 能够分析类能力的程序被称为反射(reflective). 反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,容许程序在运行时加载.探知. ...

  5. Lucene.net(4.8.0) 学习问题记录四: IndexWriter 索引的优化以及思考

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  6. 苹果内购服务器验证之receipt返回多组in_app思考

    最近有部分用户反映,苹果内购充值失败,经过测试总结有几个关键点出现问题 1.app购买成功苹果没有返回票据,属于票据遗漏(取决于苹果服务器的响应状况),只能客户端进行监听刷新等处理 2.app连续购买 ...

  7. 使用WinDbg获取SSDT函数表对应的索引再计算得出地址

    当从Ring3进入Ring0的时候会将所需要的SSDT索引放入到寄存器EAX中去,所以我们这里通过EAX的内容得到函数在SSDT中的索引号,然后计算出它的地址首先打开WinDbug,我们以函数ZwQu ...

  8. NtDuplicateObject小解读

    源进程和目标进程可以是一个吗 当然执行进程可以是同一个吗 ,当然标志位重要!有一个关闭源进程的标志位 第一步通过ObReferenceHandleTable获得源进程对象(数据结构) //为新的句柄构 ...

  9. C/C++ typedef

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  10. 要学的东西太多了,还想学习opencv

    资料先放这里,以后好好学 http://m.blog.csdn.net/column/details?alias=opencv-tutorial eclipse加载opencv库成功! B站视频教程资 ...