ionic2+Angular 依赖注入之Subject ——使用Subject来实现组件之间的通信
在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来实现组件之间的通信的更多相关文章
- Angular依赖注入详解
Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...
- 30行代码让你理解angular依赖注入:angular 依赖注入原理
依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...
- angular 依赖注入原理
依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...
- [译] 关于 Angular 依赖注入你需要知道的
如果你之前没有深入了解 Angular 依赖注入系统,那你现在可能认为 Angular 程序内的根注入器包含所有合并的服务提供商,每一个组件都有它自己的注入器,延迟加载模块有它自己的注入器. 但是,仅 ...
- Angular依赖注入:全面讲解(翻译中)
在实际使用Angular依赖注入系统时,你需要知道的一切都在本文中.我们将以实用易懂并附带示例的形式解释它的所有高级概念. Angular最强大.最独特的功能之一就是它内置的依赖注入系统. 大多数时候 ...
- 理论+案例,带你掌握Angular依赖注入模式的应用
摘要:介绍了Angular中依赖注入是如何查找依赖,如何配置提供商,如何用限定和过滤作用的装饰器拿到想要的实例,进一步通过N个案例分析如何结合依赖注入的知识点来解决开发编程中会遇到的问题. 本文分享自 ...
- angular 依赖注入
依赖注入 依赖注入(DI)是一个经典的设计模式, 主要是用来处理组件如何获得依赖的问题.关于DI,推荐阅读Martin Flower的文章(http://martinfowler.com/art ...
- angular依赖注入的理解(转)
使用过java进行开发的人肯定知道大名鼎鼎的spring框架,对于spring的IOC肯定也有所了解,通过配置文件定义好bean之后,如果需要使用这些bean,不需要自己去实例化,而是跟spring这 ...
- angular依赖注入(2)——注入器的使用
一.显示注入器 injector = ReflectiveInjector.resolveAndCreate([Car, Engine, Tires]); let car = injector.get ...
随机推荐
- 使用notepad++作为keil的外部编辑器
之前一直不喜欢keil的编辑界面,但是又不想太浮夸.看到很多群里有人用vscode写stm32的序,但是直接用vscode编写的花,各种设置很麻烦.而且还不能调试.于是想到有没有一个轻便简约的外部编辑 ...
- Tp-link路由器怎么设置端口映射 内网端口映射听语音
https://jingyan.baidu.com/article/ca00d56c710ef9e99eebcf85.html 只有一台能上网的电脑就可以自己免费搭建服务器,本经验简单介绍家用tp-l ...
- 利用H5构建地图和获取定位地点
地图与地理定位 定位在大部分项目中都需要实现,如何实现主要有如下的几种方法 H5定位 在HTML5中navigator有很强大的功能,其中就有定位的方法 navigator.geolocation.g ...
- 邓_tp_笔记
<?phpnamespace app\teacher\controller;use think\Db;use app\common\model\Classcourse;use app\commo ...
- 读书笔记之《Java编程思想》
17. 容器 Set 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素. Set接口不保证维护元素的次序 Map 映射表(关联数组)的基本思想是维护的是键-值(对)关联,因此可以用键来查找 ...
- Java 中判断类和实例之间的关系
判断类与实例的关系有以下三种方式 1.instanceof关键字,用来判断对象是否是类的实例 (对象 => 类 ) 2.isAssignableFrom,用来判断类型间是否存在派生关系 (类 ...
- 关于Serializable的serialVersionUID
在实现了Serializable接口的class中,需要声明一个long serialVersionUID,用来标明当前class的版本号,但很多人在编程时,总是不原意去声明这个serialVersi ...
- 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层
Github:https://github.com/nnngu 项目源代码:https://github.com/nnngu/nguSeckill 前端交互流程设计 对于一个系统,需要产品经理.前端工 ...
- Hyperledger Fabric CouchDB as the State Database
使用CouchDB作为状态数据库 状态数据库选项 状态数据库包括LevelDB和CouchDB.LevelDB是嵌入在peer进程中的默认键/值状态数据库,CouchDB是一个可选的外部状态数据库.与 ...
- Log4j扩展使用--输出地Appender
OK,现在我们来研究输出低Appended. Appender控制日志输出的位置 Log4j日志系统允许把日志输出到不同的地方,如控制台(Console).文件(Files).根据天数或者文件大小产生 ...