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被移除了.官方考虑是基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会 ...
随机推荐
- protobuf/android 交叉编译笔记
protobuf 交叉编译笔记 目标是使用 android ndk 的工具链编译出 android armeabi-v7a 可用的 protobuf 库. 交叉编译环境配置 windows 平台 下载 ...
- 自己动手修改Robotium代码(下)
public void takeScreenshot(){ View decorView = viewFetcher.getRecentDecorView(viewFetcher.getWindo ...
- java.lang.Collections
java.lang.Collections 此类完全由在collection上进行操作或返回 collection 的静态方法组成.也就是说Collections提供了对Collection集合操作的 ...
- TP 3.2.3 接入PHPMailer
TP 3.2.3 接入PHPMailer 项目需要接入邮件发送,这里先记录. 首先在开发这个功能先,您需要先下载个phpmailer的类,这里github 一搜索就有. 如:https://githu ...
- Vue-cli创建项目从单页面到多页面2-history模式
之前讲过怎样将vue-cli创建的项目改造成多页面(vue-cli创建项目从单页面到多页面),今天说一下怎样在多页面的前提下使用history模式. 如何使用history模式 因为vue默认的has ...
- 关于svg
动画:css3动画,canvas(js动画),svg(html动画). svg基本元素 version: 表示 <svg> 的版本,目前只有 1.0,1.1 两种 xmlns:http:/ ...
- Flex布局学习笔记
任何元素都可以使用Flex布局,包括行内元素 display: flex; display: inline-flex使用Flex布局之后,子元素的float, clear, vertical-alig ...
- [C#]使用Label标签控件模拟窗体标题的移动
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...
- liunx分布式监控工具
监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的.你要确保用户始终可以打开你的网站并且网速不慢.服务器监控工具允许你收集和分析有关你的Web服务器的数据. 有许多非常好的服务器监控解决 ...
- php面向对象(OOP)编程完全教程(转载笔记,有兴趣可以看看))
http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/09/10/1823042.html