Angular 非父子组件间的service数据通信
完成思路:以service.ts(主题subject---订阅sbuscribe模式)为数据中转中间件,通过sku.ts的数据更改监测机制,同步更改service.ts中的数据,同时buy.ts组件实时接收service.ts的变化后的数据完成数据共享传递。
1、定义service.ts共享数据中转ts文件
import {Injectable} from '@angular/core';
import { Subject } from "rxjs/Subject";
export class Sku{
skuInfo:{}
}
@Injectable()
export class TongxinProvider {
public skuList:Sku = {
skuInfo:{}
};
constructor(
) {
console.log('Hello TongxinProvider Provider');
}
//实例化主题Subject类对象
private Source=new Subject<any>();
public Status$=this.Source.asObservable();
// 定义数据传递函数
// 商品详情页商品规格选择与购买组件交互
public skuBuy(data){
this.skuList.skuInfo = data;
this.Source.next(this.skuList.skuInfo);
}
}
2、商品规格列表sku.ts组件向外部其他组件发送当前选中的商品规格信息
1 import {Component, Input, OnChanges} from '@angular/core';
2 import {TongxinProvider} from "../../providers/tongxin";
3 import {ValidateProvider} from "../../providers/validate";
4 import {PopProvider} from "../../providers/pop";
5
6 @Component({
7 selector: 'good-sku',
8 templateUrl: 'good-sku.html'
9 })
10 export class GoodSkuComponent implements OnChanges {
11 // angular @Input接受父组件传递的商品规格数据
12 @Input() skuInfo: object = {};
13 public colorSku:number = 0;
14 public sizeSku:number = 0;
15 public goodNum:number = 0;
16 constructor(public TongXin: TongxinProvider,
17 public Validate: ValidateProvider,
18 public Pop:PopProvider) {
19 console.log('Hello GoodSkuComponent Component');
// 当组件数据不是有父级组件的可输入属性导入而是当前组件的静态数据时,需先在construcor函数里首先调用下,手动向buy.ts导入初始化数据,服务才能正常起作用。如:
this.changeSku();
20 }
21 // 在ngOnChanges中初始化调用导入商品规格数据到service.ts服务中去
22 ngOnChange方法会在this.skuInfo数据发生改变是自动调用执行
23 ngOnChanges(){
24 this.goodNum = this.skuInfo['stock'];
25 this.changeSku();
26 }
27 // 更改发布商品规格信息
28 public changeSku() {
29 this.TongXin.skuBuy(this.skuInfo);
30 }
31 //商品规格一切换
32 public setColorSku(index) {
33 this.colorSku = index;
34 }
35 // 商品规格二切换
36 public setSizeSku(index) {
37 this.sizeSku = index;
38 }
39 // 增加商品数量
40 public addGood(){
41 console.log(this.goodNum)
42 if(this.skuInfo['num'] >= this.goodNum){
43 this.Pop.toast("不能再多了!");
44 return false;
45 }
46 this.skuInfo['num'] ++;
47 this.skuInfo['stock'] --;
48 }
49 // 减少商品数量
50 public descGood(){
51 if(this.skuInfo['num'] <= 1){
52 this.Pop.toast("不能再少了!");
53 return false;
54 }
55 this.skuInfo['num'] --;
56 this.skuInfo['stock'] ++;
57 }
58 }
3、buy.ts组件接收sku.ts组件发送的规格信息
import {Component, Input, OnInit, Output} from '@angular/core';
import { PopProvider } from "../../providers/pop";
import {serviceProvider} from "../../providers/service";
@Component({
selector: 'share-header',
templateUrl: 'share-header.html'
})
export class ShareHeaderComponent implements OnInit{
@Input() buy: string = '';
//声明事件发射器
@Output() checkEmitter = new EventEmitter<boolean>();
private isLogin:boolean = false;
public goodSku:Object = {};
constructor(public Pop:PopProvider,
public navCtrl:NavController,
public navParams:NavParams,
public service:serviceProvider) {
console.log('Hello ShareHeaderComponent Component');
}
// 在ngOnInit(组件初始化完成以后)接收sku.ts组件发送的数据并保存到this.goodSku属性中,便于buyGood方法中调用商品规格数据
ngOnInit(): void {
this.getSkuInfo();
}
public getSkuInfo(){
this.service.Status$.subscribe(res=>{
// 至此完成了由sku.ts组件到buy.ts组件的数据共享传递流程
this.goodSku = res;
})
}
// 点击购买商品
public buyGood(id) {
console.log(this.goodSku)
}
}
Angular 非父子组件间的service数据通信的更多相关文章
- Vue—非父子组件间的传值(Bus/发布订阅模式/观察者模式/总线)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue非父子组件间传参问题
最近在使用vue进行开发,遇到了组件之间传参的问题,此处主要是针对非父子组件之间的传参问题进行总结,方法如下:一.如果两个组件用友共同的父组件,即 FatherComponent.vue代码 < ...
- vue bus方式解决非父子组件间的传值
对于非父子组件之间的传值 通常使用VUEX 和总线等方式解决 这里我聊聊发布订阅模式(总线) <body> <div class="app"> <ch ...
- vue非父子组件间通信
有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的Vue实例作为中央事件总线: 有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的 Vue 实例作为中央事件总线: var bu ...
- Vue 非父子组件通信
组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...
- vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通 ...
- Vue 非父子组件通信方案
Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...
- vuejs非父子组件传值
当父组件要给孙子,或者孙子与孙子要传值的时候怎么传,一层一层传太麻烦了,vuejs提供了一中模式叫发布订阅模式(观察者模式,bus,总线)来处理非父子组件间的传值 <div id='root'& ...
- Vue2.0父子组件间事件派发机制
从vue1.x过来的都知道,在vue2.0中,父子组件间事件通信的$dispatch和$broadcase被移除了.官方考虑是基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会 ...
随机推荐
- Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
在struts2中有很多种跳转方式如下是在struts-default.xml截取的一段源码,常用的跳转有 转发:dispatcher.重定向:redirect.转发到Action:chain.重定向 ...
- 【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类
背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题.我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题.视图和控制器相关的内存泄露,几乎都不存在了.后来想着一直就那个工 ...
- 解决WebSocket兼容ie浏览器版本问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7942323.html 在使用Netty进行WebSocket开发时,测试发现:ie 11系列个别低版本连接W ...
- null与undefined的比较
null在JavaScript中是关键字,它属于一个特殊的值,即空值. 而undefined它不是关键字,它表示未定义,属于预定义的全局变量. null == undefined 返回的是 true ...
- Thinkphp使用phpexcel导入文件并写入数据库
现实中,我们往往很多地方都需要这样批量导入数据,除了phpexcel还有csv等方法可以解决 下面详细介绍一下使用方法 首先在官方下载安装包解压到本地,然后复制保存到tp框架下的vendor目录下 h ...
- QTP生成随机数字+字母
以下函数实现随机生成17位数(包括字母和数字),仍有改进的空间,可根据具体要求适当修改 Dim targetstring '调用返回函数给变量.Function过程通过函数名返回一个值 targets ...
- CSS书写规范与理论
前端体系的变化可谓是日新月异,短短一年时间,从理论.框架.构建工具.甚至开发语言都发生非常大的变化. 随着新项目就即将启动,我抽时间回顾了一下以往项目的前端架构,零零散散产生了许多想法,尽量一一记录下 ...
- python学习之路day2
模块学习: 标准库: os: 第三方库:
- python3.6 +tkinter GUI编程 实现界面化的文本处理工具
更新: 2017.07.17 补充滚动条.win批处理拉起py 2017.08.13 新增自定义图标 --------原创 blogs: http://www.cnblogs.com/ ...
- 海尔U+的启发:让用户对智能家居拥有“话语权”
近年来,智能家居成了IT产业的重要话题,随着智能家电一系列产品的出现,智能家居最终開始从概念走向落地.只是,眼下智能家居行业有个非常突出的问题------因为缺乏开放的意识,不管是产品还是理念 ...