Angular 非父子组件间的service数据通信

完成思路:以service.ts(主题subject---订阅sbuscribe模式)为数据中转中间件,通过sku.ts的数据更改监测机制,同步更改service.ts中的数据,同时buy.ts组件实时接收service.ts的变化后的数据完成数据共享传递。

1、定义service.ts共享数据中转ts文件

 1 import {Injectable} from '@angular/core';
 2 import { Subject } from "rxjs/Subject";
 3 
 4 export class Sku{
 5     skuInfo:{}
 6 }
 7 @Injectable()
 8 
 9 export class TongxinProvider {
10    public skuList:Sku = {
11         skuInfo:{}
12     };
13     constructor(
14     ) {
15         console.log('Hello TongxinProvider Provider');
16     }
17 //实例化主题Subject类对象
18     private Source=new Subject<any>();
19     public Status$=this.Source.asObservable();
20 // 定义数据传递函数
21 // 商品详情页商品规格选择与购买组件交互
22     public skuBuy(data){
23         this.skuList.skuInfo = data;
24         this.Source.next(this.skuList.skuInfo);
25     }
26 
27 }

 

  

2、商品规格列表sku.ts组件向外部其他组件发送当前选中的商品规格信息

 1  1 import {Component, Input, OnChanges} from '@angular/core';
 2  2 import {TongxinProvider} from "../../providers/tongxin";
 3  3 import {ValidateProvider} from "../../providers/validate";
 4  4 import {PopProvider} from "../../providers/pop";
 5  5 
 6  6 @Component({
 7  7     selector: 'good-sku',
 8  8     templateUrl: 'good-sku.html'
 9  9 })
10 10 export class GoodSkuComponent implements OnChanges {
11 11     // angular @Input接受父组件传递的商品规格数据
12 12     @Input() skuInfo: object = {};
13 13     public colorSku:number = 0;
14 14     public sizeSku:number = 0;
15 15     public goodNum:number = 0;
16 16     constructor(public TongXin: TongxinProvider,
17 17                 public Validate: ValidateProvider,
18 18                 public Pop:PopProvider) {
19 19         console.log('Hello GoodSkuComponent Component');
20      // 当组件数据不是有父级组件的可输入属性导入而是当前组件的静态数据时,需先在construcor函数里首先调用下,手动向buy.ts导入初始化数据,服务才能正常起作用。如:
21         this.changeSku();
22     
23 20     }
24 21     // 在ngOnChanges中初始化调用导入商品规格数据到service.ts服务中去
25 22     ngOnChange方法会在this.skuInfo数据发生改变是自动调用执行
26 23     ngOnChanges(){
27 24         this.goodNum = this.skuInfo['stock'];
28 25         this.changeSku();
29 26     }
30 27     // 更改发布商品规格信息
31 28     public changeSku() {
32 29         this.TongXin.skuBuy(this.skuInfo);
33 30     }
34 31     //商品规格一切换
35 32     public setColorSku(index) {
36 33         this.colorSku = index;
37 34     }
38 35     // 商品规格二切换
39 36     public setSizeSku(index) {
40 37         this.sizeSku = index;
41 38     }
42 39     // 增加商品数量
43 40     public addGood(){
44 41         console.log(this.goodNum)
45 42         if(this.skuInfo['num'] >= this.goodNum){
46 43             this.Pop.toast("不能再多了!");
47 44             return false;
48 45         }
49 46         this.skuInfo['num'] ++;
50 47         this.skuInfo['stock'] --;
51 48     }
52 49     // 减少商品数量
53 50     public descGood(){
54 51         if(this.skuInfo['num'] <= 1){
55 52             this.Pop.toast("不能再少了!");
56 53             return false;
57 54         }
58 55         this.skuInfo['num'] --;
59 56         this.skuInfo['stock'] ++;
60 57     }
61 58 }    

 

 

3、buy.ts组件接收sku.ts组件发送的规格信息

 1 import {Component, Input, OnInit, Output} from '@angular/core';
 2 import { PopProvider } from "../../providers/pop";
 3 import {serviceProvider} from "../../providers/service";
 4 
 5 @Component({
 6     selector: 'share-header',
 7     templateUrl: 'share-header.html'
 8 })
 9 export class ShareHeaderComponent implements OnInit{
10 
11     @Input() buy: string = '';
12     
13     //声明事件发射器
14     @Output() checkEmitter = new EventEmitter<boolean>();
15     private isLogin:boolean = false;
16     public goodSku:Object = {};
17     constructor(public Pop:PopProvider,
18                 public navCtrl:NavController,
19                 public navParams:NavParams,
20                 public service:serviceProvider) {
21         console.log('Hello ShareHeaderComponent Component');
22     }
23     // 在ngOnInit(组件初始化完成以后)接收sku.ts组件发送的数据并保存到this.goodSku属性中,便于buyGood方法中调用商品规格数据
24     ngOnInit(): void {
25         this.getSkuInfo();
26     }
27     public getSkuInfo(){
28        this.service.Status$.subscribe(res=>{
29              // 至此完成了由sku.ts组件到buy.ts组件的数据共享传递流程
30             this.goodSku  = res;
31         })
32     }
33 
34     // 点击购买商品
35     public buyGood(id) {
36 
37         console.log(this.goodSku)
38 
39     }
40 }

 

posted @ 2017-12-28 13:30  千叶祥龙  阅读(2438)  评论(0编辑  收藏  举报