如果我确实在 BorrowerService 类中订阅了,我发现 .next()
按预期工作。主题似乎是调用 .next()
的服务类和组件之间的不同实例,因此不会获得该订阅。
这是理解Angular Services或Observables的失败吗?如何更新服务中的值并被动地获取组件中的更改,而不知道何时调用 .next()
?
借款人-报告.组件. ts
@Component({
...
providers: [BorrowerService]
})
export class BorrowerReport {
private borrower: Borrower;
constructor(private borrowerService: BorrowerService) {
this.borrowerService.borrowerChanged.subscribe(borrower => {this.borrower = borrower});
}
}
借款人.服务. ts
@Injectable()
export class BorrowerService {
public borrowerChanged: Subject<Borrower> = new Subject<Borrower>();
//event handler
selectBorrower(borrower: Borrower) {
this.borrowerChanged.next(borrower);
}
}
借款人.服务. ts
import {Injectable} from '@angular/core';
import {BehaviorSubject} from 'rxjs';
@Injectable()
export class BorrowerService {
public borrowerChanged = new BehaviorSubject<string>('Defaut Value');
borrowerChangedObservable = this.borrowerChanged.asObservable();
constructor(){}
changeValue(value: string): void {
this.borrowerChanged.next(value);
}
}
然后在组件中:
借款人-报告.组件. ts
要获得这些值,您需要:
constructor(private borrowerService: BorrowerService) {
this.borrowerService.borrowerChangedObservable
.subscribe((borrower) => {
console.log(borrower);
});
}
要设置新值,请执行以下操作:
sendNewValueToBorrowerService(){
this.borrowerService.changeValue('my new value');
}
不要忘记在provides数组中添加服务,在同一个模块的declarations数组中添加组件。
问题在于您的服务范围,并且< code>@ngModule没有提供该服务。如果您希望这是一个单例服务(多个组件的同一个服务实例),那么您将希望在包含所有子组件的父模块中提供服务。对于保证路线,请将其添加到您的< code>app.module.ts中。在模块中导入它,并像在组件中一样将其作为服务提供(但是,要将它作为提供者从组件中移除...您只希望父模块提供它)。
然后,您可以像以前一样将服务导入到组件中,提供程序
将成为父模块。基本思想是父模块将承载所有子组件的服务,因此所有子组件都将接收相同的服务实例(因此具有相同的值)。
旁注:此 SO 答案提供了有关创建单例服务调用 ApiService
的详细信息,应作为可靠的指南。另一个顶部答案也提供了可靠的解释。
第二个注意:如果你想从你的主题推送更新,你也需要使用一个行为主题。对BehaviorSubject的订阅会自动更新,而对Subject的订阅必须手动调用。
我试图利用固有的WSO2ESB主题发布到jms队列。我已经创建了主题,并提供了一个订阅者URL:jms:/topictest?transport.jms.destinationtype=queue。然而,当我将消息发布到主题时,它不能被传递到队列。日志生成以下内容 “系统无法从jms:/queue?destination=topictest URL推断传输信息。” 另外,我似乎不知道如何发布到WS
我正在使用一个服务从url中检索数据,我正在另一个组件中使用该服务在前端中显示数据。。。 我的服务: 使用该服务的我的组件: 但我在控制台中得到以下错误: core.js:1633错误类型Error: req.url.toLowerCase不是HttpXsrfInterceptor.push中的函数../node _ modules/@ angular/common/Fe sm5/http . j
例: 注意:是非Android 运行环境, 使用的是RxJava2.x
我有一个rxJava2可观察对象,我想有条件地订阅它。场景i将进行网络调用,并且只有当设备连接到网络时才会调用。我想做下面的事情 有什么建议吗?有没有更好的办法?
我试着按照1给出的教程学习。我创建了一个主题,其中有两个主题的订阅,分别使用sqlFilter(user_age<50)和(user_age>=50)。我为消息定义了一个自定义属性user_age。但当我发送关于这个主题的消息时,两个订阅都收到相同的消息,这是胡说八道!知道吗? 我的代码完全是从tuto中给出的代码中获得灵感的,只是我使用这段代码接收来自给定订阅的消息:
我有一个使用ActiveMQ的JMS生产者/订阅者的简单Spring应用程序,配置如下: 我试过所有可能的解决办法,但没有一个奏效。我们非常感谢任何帮助