我有一个非常简单的场景,其中包含输入字段和一系列部分,这些部分根据输入字段中输入的内容进行API调用。
现在输入字段本身在一个不同的组件中,所以我所做的是在服务中创建一个behaviorSubject,有一个默认值,然后任何时候用户更改输入字段我只是在内部调用服务中的另一个方法在behaviorSubject上调用next。
然后在我的不同UI部分中,我订阅了这个behaviorSubject,并且想要在任何时候更改值进行API调用。请注意,每个部分的API端点都不同,但它们需要同时触发。
但是,我无法让这个工作。这是我到目前为止所拥有的
我的服务中的代码changeService.ts:
valueChangedSubject: BehaviorSubject<any>: new BehaviorSubject({});
constructor() {}
valueHasChanged(updatedValue: any) {
this.valueChangedSubject.next(updatedValue);
}
触发事件的一个组件中的代码:
valueChanged(changedVal: string) {
this.changeService.valueHasChanged({val: changedval});
}
订阅行为主题的组件中的代码:
this.changeService.valueChangedSubject.subscribe((val:any) => {
console.log('OK I am here ', val);
});
问题在于,“我在这里”#39;在刷新时第一次打印,但在任何时候我调用valueChanged()方法后它都不会触发observable。
我知道我遗漏了一些与“热观察”相关的内容。这里。但是怎么做以及如何做到这一点?我尝试使用share()或publish(),但无法按预期工作。
答案 0 :(得分:0)
一个BehaviourSubject是一个热门的观察者。 Hot意味着,即使现在有订阅者,observable也会触发新值。我发现您在问题中提供的代码没有任何问题。它看起来很好。
您确定valueChangesSubject
无法随时完成吗?例如,在处理错误时,Subject将完成。
您可以通过在订阅中使用onCompleted回调来检查Observable是否完成。
this.changeService.valueChangedSubject.subscribe(
next => console.log('OK I am here ', next),
error => console.error('Error. Observable completes', error),
() => console.log('Observable completes. No more values will be submitted')
);