Angular 尽管对 observable 进行了更新,但仍未执行订阅

Angular subscription is not executed despite an update to the observable

我使用 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);
  }
}

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

在另一个组件中,而不是 table,我正在注入 SelectRowIdService 并订阅 selectedRowId$:

  private selectedRowId?: number;

  constructor(private selectRowIdService: SelectRowIdService) {}

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

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

如果您的第二个组件出现在其他地方并且在离开您的 table 之后,那么这是预期的行为。基本上,有了 Subjects,如果你迟到了,你什么也得不到。用编程的话来说,如果你在值发出后订阅,那么你将不会收到任何值。

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

这里有一个 StackBlitz link 演示了这两种情况。