在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. Flask连接数据库打怪升级之旅

    一.前言 在初学 Flask 的时候,在数据库连接这部分也跟每个初学者一样.但是随着工作中项目接手的多了,代码写的多了,历练的多了也就有了自己的经验和技巧.在对这块儿代码不断的进行升级改造后,整理了在 ...

  2. UE4 AsnycTask

    使用AsnycTask可以将制定代码放在指定线程中执行,例如更新文理必须放在游戏线程. AsyncTask(ENamedThreads::GameThread, [=](){      updateT ...

  3. tomcat服务器一闪而过解决方法

    JDK没有配置,下载JDK安装到电脑上,然后在电脑->属性->高级系统设置->环境变量,将JDK中bin文件的目录E:\Program Files (x86)\Java\jre7\b ...

  4. CSS3技巧巧妙使用:not(:last-of-type)简化你的css代码

    终于找到了一个好方法,使用:not(:last-of-type)简单方便,再也不要麻烦的单独使用:last-of-type了,不错! 应用场景:平时我们的列表一般都会有分割线,但是最后一个列表没有分割 ...

  5. addslashes() 函数返回在预定义字符之前添加反斜杠的字符串

    . 预定义字符是: 单引号(') 双引号(") 反斜杠(\) NULL 提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串. 注释:默认地,PHP 对所有的 GET.PO ...

  6. navicat将多个表导出为一个sql文件

    1.shift选中多个表 2右键选择--转储sql文件---结构和数据

  7. 【开发技术】 java和JSP和JavaScript有什么区别

    JSP全称是:java server page,意思是基于JAVA服务器的网页技术,跟asp,php一样,都是网页制作用的语言 JavaScript:也成为JS,跟JAVA没啥关系,就是赶时髦起个这名 ...

  8. 如何跳出页面的Frame框架

    摘录自:http://blog.csdn.net/clare504/article/details/9347363 很多网页都是框架结构的,在很多的情况下会通过按钮点击事件或链接,跳出框架转到其它界面 ...

  9. 分享整理的免费API接口

    天气接口 聚合数据: http://op.juhe.cn/onebox/weather/query 用例 官方文档 来源:weather.com 百度接口: http://api.map.baidu. ...

  10. Python3基础知识

    1.查看关键字 Python3查看关键字要先导入模块keyword,然后运用keyword的属性kwlist获取 >>> import keyword>>> key ...