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 之后,那么这是预期的行为。基本上,有了 Subject
s,如果你迟到了,你什么也得不到。用编程的话来说,如果你在值发出后订阅,那么你将不会收到任何值。
在这种情况下,您应该改用 BehaviorSubect
。
这里有一个 StackBlitz link 演示了这两种情况。
我使用 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 之后,那么这是预期的行为。基本上,有了 Subject
s,如果你迟到了,你什么也得不到。用编程的话来说,如果你在值发出后订阅,那么你将不会收到任何值。
在这种情况下,您应该改用 BehaviorSubect
。
这里有一个 StackBlitz link 演示了这两种情况。