传递和展开可观察为主题的对象

问题描述 投票:0回答:2

我需要将数据从一个组件传递到另一个组件,但是这样做很困难。

我有一个Observable,我需要以Subject的形式传递,这是另一个可观察到的。我怎么做?我目前使用的方式无法正常工作,因为它已在目标组件 undefined

中获得

这是我所拥有的:

card.component.ts (全部开始的地方]

showBox(studentID) {
    const airportPickup = this.studentService.getCurrentStudents().pipe(
        map(snaps => {
            const student = snaps.find( s => s.studentID === studentID );
            return {
                requirePickup: student.pickup,
                whopickup: student.whoPickup
            };
        })
    );
    this.studentService.airportPickupDropoff.next(airportPickup);
}

如果我console.log(),则airportPickup我得到了对象。没有问题。问题是当我在其他组件中获得它时,将其显示为undefined

flight-info.component.ts (目标)

getAirportPickup() {
    this.studentService.airportPickupDropoff.subscribe(
        (apdata) => {
            this.airportPickupDropoff = apdata;
        },
        (e) => alert(e)
    );
}

[service我有这个:

airportPickupDropoff = new Subject<any>();

angular rxjs angular2-observables rxjs-observables
2个回答
1
投票

您需要订阅可观察对象,或将其与RxJS运算符(例如tap)链接,以便将可观察对象中的值分配给您的airportPickupDropoff主题。

选项1:

showBox(studentID) {
    this.studentService.getCurrentStudents().pipe(
        map(snaps => {
            const student = snaps.find( s => s.studentID === studentID );
            return {
                requirePickup: student.pickup,
                whopickup: student.whoPickup
            };
        })
    ).subscribe(response => {
      this.studentService.airportPickupDropoff.next(response);
    });
}

选项2:

showBox(studentID) {
    this.studentService.getCurrentStudents().pipe(
        map(snaps => {
            const student = snaps.find( s => s.studentID === studentID );
            return {
                requirePickup: student.pickup,
                whopickup: student.whoPickup
            };
        }),
        tap(response => this.studentService.airportPickupDropoff.next(response)),
    )
}

0
投票

也许最好通过Subject而不是另一个Observable发送数据?

showBox(studentID) {
  ///...
  airportPickup.subscribe(apdata => this.studentService.airportPickupDropoff.next(apdata));
}
© www.soinside.com 2019 - 2024. All rights reserved.