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被移除了.官方考虑是基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会 ...
随机推荐
- Python待分析的模块
fcntl 文件控制模块 http://docs.python.org/2.7/library/fcntl.html#module-fcntl struct 二进制文本处理模块 http://docs ...
- VMware下Linux网络配置局域网和外网访问
要使用Linux系统很重要的一个操作就是使Linux系统能够访问互联网,只有Linux系统能够访问互联网才能够去下载很多自己所需要的资源,如果不能访问互联网那么使用Linux系统往往会卡在这一步,假设 ...
- javaBean实体包区分
随着软件工程结构越来越复杂,单一的entity实体包无法满足业务需要,可以采取PO,BO,DTO结构来分类实体. PO (Persistent Object):与数据库表数据关联的实体. BO(Bus ...
- tomcat集群日志切割和远程备份脚本分享
笔者一共有3台tomcat服务器,一共4个tomcat服务,未来还会增加4个作为负载,笔者想通过在存储服务器对tomcat服务的日志进行远程切割和备份到存储上. 文中采用清空日志的方式,优点是不用重启 ...
- dedecms注入漏洞
版本:Powered by DedeCMSV57_GBK © 2004-2011 DesDev Inc. 漏洞利用EXP:plus/recommend.php?action=&aid=1&am ...
- javaScript基础概念小知识点集
数据类型 typeof是一个操作符而不是函数,因此例子中圆括号尽管可以使用,但不是必须的. 只要在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null NaN是一个特殊的数值,与任何值都 ...
- 实践作业2:黑盒测试实践——选择并下载测试工具 Day 2
1.选择工具为Katalon Studio 基于 Selenium 和 Appium 框架,Katalon Studio隐藏幕后的所有技术复杂性,并提供友好的用户界面与手动模式(用户可以拖放,选择关键 ...
- Go语言教程5 if switch select
首先您需要有php或是c的基础. 否则可能看不明白 方法如下 if 表达式{ //需要注意的是 没有括号. 没错. 没有括号 比如 if 1>2 {}else{} } else { } s ...
- tp中like多字段同时怎么模糊搜索
例如 select * from tbl where a like '%123%' or b like '%123%' or c like '%123%' ;实现这样的功能,thinkphp怎么写呢? ...
- eclipse修改内存大小
一般安装完eclipse之后,在安装目录下你应该可以看到有一个 eclipse.ini 文件,对了,就是在这个文件里面修改,我打开同事机器上这个文件,里面的内容是: -vmargs-Dosgi.spl ...