• 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 }
  • 相关阅读:
    转:windows通过VNC访问远程ubuntu14.04 【 server】服务器
    【转】研究了代码质量后,开发速度提高了2倍,bug减少了15倍
    【转】PuTTY的ppk密钥与OpenSSH密钥之间的相互转换
    【转】outlook配置腾讯企业邮箱(腾讯企业邮箱imap服务器地址)
    【转】YApi结合swag管理和生成go项目restful API文档
    [转] 超高效!SwaggerYapi的秘密
    【转】SSH 远程登录很慢的解决方法
    [转]go语言io reader_如何从io.Reader 中读数据
    eslint 支持多个三目表达式
    33
  • 原文地址:https://www.cnblogs.com/hsl-shiliang/p/8135231.html
Copyright © 2020-2023  润新知