当前正在学习RxJS。我在服务中有一个整数selectedCourseIndex
,我想订阅一个单独的组件。
courses-section.service.ts
private selectedCourseIndex: number = -1; //this number can change from another method
private selectedCourseIndexUpdated = new Subject<number>();
getSelectedCourseUpdateListener(){
return this.selectedCourseIndexUpdated.asObservable();
}
courses-section.component.ts
private selectedCourseIndex: number = -1; //Placeholder initial selectedCourseIndex until new one given on init from courses-section service
private selectedCourseSub: Subscription;
constructor( public coursesSectionService: CoursesSectionService ){}
ngOnInit(){
this.selectedCourseIndex =
this.coursesSectionService.getSelectedCourseIndex();
this.selectedCourseSub = this.coursesSectionService
.getSelectedCourseUpdateListener()
.subscribe((selectedCourseIndex: number) => {
this.selectedCourseIndex = selectedCourseIndex;
console.log('this fires when subscription updates'); //this never fires once
});
}
但是,无论是初始订阅还是整数更改,订阅都不会触发。怎么了?
答案 0 :(得分:2)
可观察到的“主题”不会在订阅时重播以前的值。仅当您在服务中执行以下操作时,您的订阅才会触发[以某种方式-
this.selectedCourseIndexUpdated.next(<your new number>);
要在每个订阅上触发订阅(以获取最后发出的值),则应使用“ BehaviorSubject”而不是“ Subject”,例如-
private selectedCourseIndexUpdated = new BehaviorSubject<number>(0);
BehaviorSubject重播每个订阅上最后发出的值。注意BehaviorSubject构造函数采用默认值。
答案 1 :(得分:1)
如果我错了,请纠正我,
您的问题:您想要一个可观察对象具有的当前(或最新)值,而不管某人是否立即发出了一个值。
答案: 主题或可观察没有当前值。发出值时,它将传递给订阅者,并使用它来进行可观察的操作。仅当向主题流发出另一个值时,Observable才会起作用。
如果要使用当前值,请使用 BehaviorSubject (精确地满足您的需要),它会保留最后一个发出的值,而与发出它的时间无关,并立即将其传达给新的订阅者。
注意:它还具有方法 getValue()以获取当前值。
您面临的另一个问题。
问题:您当前的代码似乎无效。
答案: 让我举一个例子,说明我如何使用 Observable -
Courses-action.service.ts
import { Injectable } from ‘@angular/core’;
import { Subject } from ‘rxjs’;
@Injectable()
Export class CoursesActionService {
Public selectedCourseIndexUpdated = new Subject<any>();
Public isCourseIndexUpdated$ = this.selectedCourseIndexUpdated.asObservable();
Public announceSelectedCourseIndex(response: any) {
this.selectedCourseIndexUpdated.next(response);
}
一些随机文件向订户发送值-
this.coursesActionService.announceSelectedCourseIndex(453);
一些随机文件,它监听发射的值-
this.coursesActionService.isCourseIndexUpdated$.pipe(takeUntil(this.destroyed$))
.subscribe(res => console.log(‘i have the response’, res));