javascript - 主题不发出数据

标签 javascript angular typescript rxjs

我有一个应用程序可以从用户那里接收数据并在表单中验证它们。当验证为真时,按钮将被启用并且用户被允许在这种情况下提交他的订单。

我不知道为什么在这个组件中我的主题不起作用。我的意思是我可以在组件中使用 .next(value),在服务中我可以使用 console.log(value) 检查它是否到达服务。

我可以看到正在接收服务,但是接收到的值没有在我想使用它们的组件中订阅。我停止运行项目但无法修复。这是我尝试过的:

AuthService.ts

  emailSubject=new Subject<string>();
  getEmail(value)
  {
    console.log(value);
    this.emailSubject.next(value); //prints email to the console correctly
  }

CarService.ts

export class CarService
{
    carrierSubject=new Subject<number>();
    orderSubject=new Subject<Order[]>();
    totalCostSubject=new Subject<number>();
    lastTotalCostSubject=new Subject<number>();
  getId(myIndex:number)
   {
    this.carrierSubject.next(myIndex);
   }
 setOrders(value)
   {
     console.log(value);
     this.orderSubject.next(value);
   }
  setTotalCost(value)
   {
     this.totalCostSubject.next(value);
   }
   lastSetTotalCost(value)
   {
     this.lastTotalCostSubject.next(value);
   }

CarPayment.ts

export class CarPaymentComponent implements OnInit {
  car:Car; 
  selectedCar:string;
  somePlaceholder : number = 0;
  myArray:Order[];
  email:string;
  constructor(private carService:CarService,private authService:AuthService) { }
  ngOnInit() {
    this.carService.carrierSubject.subscribe(value=>
      {  
         this.car=this.carService.getCar(value);
         this.selectedCar=this.car.brand;
      });
      this.carService.lastTotalCostSubject.subscribe(value=>
        {  
         this.somePlaceholder=value;
        });
        this.carService.orderSubject.subscribe(value=>
          { 
            this.myArray=value;
          }
          );
        this.authService.emailSubject.subscribe(value=>
          {
            this.email=value;
          });
    }
    onSubmit()
    {
      console.log("ORDER INFO")
      console.log('This order ordered by:'+this.email);
      console.log("Ordered Car:"+this.selectedCar);
      console.log("Ordered Parts:"+this.myArray);
      console.log("Total Cost:"+this.somePlaceholder);
    }
}

最佳答案

正如@lealceldeiro 和@FatemeFazli 所提到的,您需要使用BehaviorSubjectReplaySubject。您的代码不起作用的原因是因为您的可观察对象尚未触发任何值(value)。本质上,当您执行 .subscribe 时,您正在 Hook 更改事件。但就您而言,更改尚未触发。

AuthService.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs'; //<----Add this line

@Injectable()
export class AuthService {
  emailSubject = new BehaviorSubject<string>("test@test.com"); //<--- provide an initial value here
  getEmail(value) {
    console.log(value);
    this.emailSubject.next(value); //prints email to the console correctly
  }
}

CarService.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class CarService {
  carrierSubject = new BehaviorSubject<number>(0); //<-- provide an initial value here
  orderSubject = new BehaviorSubject<Order[]>([]); //<-- provide an initial value here
  totalCostSubject = new BehaviorSubject<number>(0); //<-- provide an initial value here
  lastTotalCostSubject = new BehaviorSubject<number>(0); //<-- provide an initial value here

  getId(myIndex: number) {
    this.carrierSubject.next(myIndex);
  }
  setOrders(value) {
    console.log(value);
    this.orderSubject.next(value);
  }
  setTotalCost(value) {
    this.totalCostSubject.next(value);
  }
  lastSetTotalCost(value) {
    this.lastTotalCostSubject.next(value);
  }
}

关于javascript - 主题不发出数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57926159/

相关文章:

JavaScript 参数对象不具有所有参数

javascript - 带有按月(如一月、二月、三月)时间戳分组的数据,并在 Highcharts 中显示为该月的总计数

javascript - 我可以在常规 JS 中监听 AngularJS 中抛出的事件吗(在 Angular 之外?)

json - Vue 获取 response.json promise 不会创建响应式(Reactive) setter/getter

javascript - 如何同时处理多个事件?

javascript - 滚动时如何从链接中删除 "visited"状态?

javascript - 如何将编码字符串作为参数发送到 Angular 中的url字符串并在新选项卡中打开

angular - *ngFor in angular2+ 不显示任何数据

angular - Angular 5+ 中装饰器@Injectable 的明确含义

typescript - 如何在 vuex 存储 typescript 中动态设置对象的属性(同时保持类型安全)