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被移除了.官方考虑是基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会 ...
随机推荐
- 激光相机数据融合(4)--KITTI数据集中matlab接口说明及扩展
KITTI数据集接口已经提供了matlab接口,本篇将说明详细说明其应用并与PCL进行对接.PCL为C++点云处理语言库,详情可见:http://pointclouds.org/ 程序可以从官网下载, ...
- spring boot系列02--Thymeleaf+Bootstrap构建页面
上一篇说了一下怎么构建spring boot 项目 接下来我们开始讲实际应用中需要用到的 先从页面说起 页面侧打算用Thymeleaf+Bootstrap来做 先共通模板页 <!DOCTYPE ...
- SSM框架通过mybatis-generator自动生成代码
一.首先eclipse配置好maven环境,并且创建好一个SSM框架的工程 二.在pom.xml中添加plugin <build> <finalName>ssm_web< ...
- c# linq的差集,并集,交集,去重【转】
using System.Linq; List<string> ListA = new List<string>(); List<string> List ...
- canvas图表(4) - 散点图
原文地址:canvas图表(4) - 散点图 今天开始完成散点图,做完这一节,我的canvas图表系列就算是完成了,毕竟平时最频繁用到的就是这几类图表了:柱状,折线,饼图,散点.经过编写canvas图 ...
- Entity Framework——建模建库
1数据库初始化策略选择 三种初始化策略: 1)CreateDatabaseIfNotExists:默认的策略.如果数据库不存在,那么就创建数据库.但是如果数据库已存在,而且实体发生了变化,就会出现异常 ...
- Linux EXT 文件系统 详解
上几章我们讲到了Linux启动的一些问题,接下来我们来看一下硬盘分割和EXT格式文件系统的问题.前面提到了分区表的问题,分区表位于MBR, 占用64个字节.所谓的硬盘分区也就是对硬盘进行规划,填写分区 ...
- CentOS7操作系统参数优化
生产环境配置需要标准化,将常用操作写成脚本用于操作系统的初始化. #!/bin/bash #Date:2017 #This Script is for centos7.3 init #01.配置yum ...
- 《跟我学IDEA》一、下载安装idea,设置背景字体编码,配置JDK
写在前面的话:作为一个在IT界摸爬滚打6年+的老程序员,我属于会的东西多而杂,但是没有任何一样精通的.曾经自己也认真过,蹉跎过,最近和别的同事朋友聊天时,突然发现自己得到的东西却很少很少,于是想认真的 ...
- 【WF2017】Mission Improbable
http://www.lydsy.com/JudgeOnline/problem.php?id=4950 对于俯视图很好解决,把所有不是0的位置拿到剩1就可以了. 对于正视图与侧视图,稍微想一下也能发 ...