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的__main__.py用法
[背景] 在看flower的时候看到__main__.py文件,不知道具体做什么用? 故先进行测试看看. [测试代码] 测试代码目录结构如下: . `-- test |-- __init__.py | ...
- Java中static关键字的详解
static关键字可以修饰方法和成员变量(不可以修饰局部变量,但是可以修饰内部类). static关键字方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者 ...
- 在PostgreSQL自定义一个“优雅”的type
是的,又是我,不要脸的又来混经验了.我们知道PostgreSQL是一个高度可扩展的数据库,这次我聊聊如何在PostgreSQL里创建一个优雅的type,如何理解优雅?大概就是不仅仅是type本身,其它 ...
- 根据自己的博客数据统计国内IT人群
装上百度统计有一段时间了,今天突然找出报表看看,发现一个很有意思的事情.访问来源TOP5依次是:北京,上海,深圳,杭州,广州 虽然大部分文章都是当时特别白的时候记录下来的遇到过的问题,但受众确实应该只 ...
- java中处理json各种各样转换方法
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互.本文将快速讲解 JSON 格式,并通过代码示例演示如 ...
- Linux笔记(固定USB摄像头硬件端口,绑定前后置摄像头)
在Android的系统会有前置摄像头和后置摄像头的定义,摄像头分为SOC类型的摄像头和USB这一类的摄像头,接下要分析就是USB摄像头这一类 . 一般在android或者linux系统中分析一个模块, ...
- java 中 “文件” 和 “流” 的简单分析
java 中 FIle 和 流的简单分析 File类 简单File 常用方法 创建一个File 对象,检验文件是否存在,若不存在就创建,然后对File的类的这部分操作进行演示,如文件的名称.大小等 / ...
- spring boot自定义log4j2日志文件
背景:因为从 spring boot 1.4开始的版本就要用log4j2 了,支持的格式有json和xml两种格式,此次实践主要使用的是xml的格式定义日志说明. spring boot 1.5.8. ...
- c++头文件重复引用问题
引子----之前写C++ 时遇到的坑 之前由于Java实在太好用了,C++的工程代码几乎没怎么碰,真的写起来的时候总会有些小bug,这里就对其中的一个进行个总结 a.h #include " ...
- SQL语言(一)
设计表student如下