【问题标题】:Angular subscription is not executed despite an update to the observable尽管对 observable 进行了更新,但未执行 Angular 订阅
【发布时间】:2022-07-28 05:44:34
【问题描述】:

我使用npm generate service 创建了一个Angular 服务。这样,创建的服务将是单例的,即该服务可以在整个应用程序中使用。服务基本上是这样的:

@Injectable({
  providedIn: 'root'
})
export class SelectRowIdService {
  private selectedRowIdState = new Subject<number>();
  selectedRowId$ = this.selectedRowIdState.asObservable();

  updateSelectedRowId(id: number) {
    console.log('updateSelectedRowId(): ' + id);
    this.selectedRowIdState.next(id);
  }
}

现在考虑一个表:每次单击一行时,我都在执行一个方法onRowClick(),它正在调用updateSelectedRowId()。每次单击一行时,都会使用正确的 id 调用此方法,我对此进行了验证。服务的updateSelectedRowId() 也会被调用。

在另一个组件内部,而不是表格,我正在注入 SelectRowIdService 并订阅 selectedRowId$

  private selectedRowId?: number;

  constructor(private selectRowIdService: SelectRowIdService) {}

  ngOnInit() {
    this.selectRowIdService.selectedRowId$.subscribe((id: number) => {
      this.selectedRowId = id;
      console.log('DemoComponent: ' + this.selectedRowId);
    });
  }

现在,此订阅从未执行,我只是不明白为什么。由于我已经验证了服务的updateSelectedRowId() 方法是在单击表格行时被调用的,所以我认为上面提到的订阅会被执行。我只能假设这与我注册服务的方式有关,这就是我在本文开头提到这一点的原因。有人对此有想法吗?

【问题讨论】:

  • 您提到,您订阅了另一个组件中的 observable,所以第一个问题,当您单击该行时,其他组件是否呈现?如果是这样,请检查 Angular 中的“ChangeDetection”。

标签: angular observable


【解决方案1】:

如果您的第二个组件出现在其他地方并且在离开您的表格后出现,那么这是预期的行为。基本上,使用Subjects,如果您参加聚会迟到,您将一无所获。用编程的话来说,如果你在值发出后订阅,那么你将不会收到任何值。

在这种情况下,您应该改用BehaviorSubect

这是一个StackBlitz link,它演示了这两种情况。

您还可以在this article 找到有关组件通信的有用信息。

【讨论】:

  • 你说得对,看来我订阅太晚了。非常感谢!
猜你喜欢
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2018-06-19
  • 2018-08-18
  • 2018-09-08
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多