RxJS,Angular:无法接收其他方法的订阅结果
问题描述:
我有这样一个角度组件:RxJS,Angular:无法接收其他方法的订阅结果
它创建一个正常的ReplaySubject。 (见constructor
)。 然后一些其他组件通过方法getSubject()
获得subject
并订阅它。另一个组件通过setValue
设置新值。这个值应该被订户接收。但是,这不会发生。它什么也收不到,甚至没有错误。
@Injectable()
export class BreadcrumbService {
subject: ReplaySubject<string>;
constructor() {
this.subject = new ReplaySubject<string>();
console.log('Step 1: Subject created');
}
getSubject(): ReplaySubject<string> {
console.log('Step 2: Return subject for subscribing');
return this.subject;
}
setValue(title: string) {
console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.');
this.subject.next(title);
}
}
如果我将订阅放在setValue()
之内,它就会按预期工作。
这里是我的组件应该接收订阅:
export class BreadcrumbComponent implements OnInit {
constructor(
private breadcrumbsService: BreadcrumbService
) {}
ngOnInit() {
this.breadcrumbsService.getSubject()
.subscribe(
success => {
console.log(success); // is never called
},
error => {
console.log(error); // is never called
}
);
}
}
我的用户如何获得这个价值?
答
我还没有看到一个错误,但 我假设你不止一次提供BreadcrumbService
。
Angular2为每个提供者维护一个实例。如果您提供多次,则会有多个实例。我假设调用setValue
的实例与BreadcrumbComponent
得到的实例不同。
如果您希望共享实例在公共父级(例如根组件)上提供共享实例。
+1
感谢您的回答!你是绝对正确的。我提供了两次'BreadcrumbService'。 –
答
请尝试使用Observables
来代替。
@Injectable()
export class BreadcrumbService {
subject: Observables<string>;
constructor() {
this.subject = new Observables<string>();
console.log('Step 1: Subject created');
}
getSubject(): Observables<string> {
console.log('Step 2: Return subject for subscribing');
return this.subject;
}
setValue(title: string) {
console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.');
this.subject.emit(title);
}
}
你检查了@Gunter的说法吗?除了一切应该没有任何错误的工作。 – micronyks