当前位置: 首页 > 知识库问答 >
问题:

组件订阅看不到主题为Observable并调用next()的Angular服务

邢硕
2023-03-14

如果我确实在 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);
    }
}

共有2个答案

柳向明
2023-03-14

借款人.服务. 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数组中添加组件。

盛承
2023-03-14

问题在于您的服务范围,并且< 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应用程序,配置如下: 我试过所有可能的解决办法,但没有一个奏效。我们非常感谢任何帮助