我在我的应用程序中已经多次这样做了。它很简单,应该可以工作……但是这一次没有。
我的问题:
我从组件A中调用了一个服务中的方法,我的组件B已经订阅了,但没有反应也没有收到任何东西。subscribe()
没有触发!
navigation-elements.service.ts
@Injectable()
export class NavigationElementsService {
updateIBOsNavigation$: Observable<any>;
private updateIBOsNavigationSubject = new Subject<any>();
constructor() {
this.updateIBOsNavigation$ = this.updateIBOsNavigationSubject.asObservable();
}
updateIBOsNavigation(navigationData) {
log.d('updateIBOsNavigation', JSON.stringify(navigationData));
this.updateIBOsNavigationSubject.next(navigationData);
}
}
IboDetailsGeneral
组件export class IboDetailsGeneral implements OnInit, OnDestroy {
id: string;
private sub: any;
constructor(private route: ActivatedRoute, private iboService: IBOsService, private navigationService: NavigationElementsService) {
this.sub = this.route.params.subscribe(params => {
this.id = params['id'];
console.log('CALLING updateIBOsNavigation FUNCTION');
this.navigationService.updateIBOsNavigation(this.id);
});
}
ngOnInit() {
console.log('CALLING updateIBOsNavigation FUNCTION AGAIN');
this.navigationService.updateIBOsNavigation('test');
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
这个组件触发了服务的方法:updateIBOsNavigation
。
IBOsNavigationElement
组件
export class IBOsNavigationElement implements OnInit {
private id: string;
constructor(private navigationService: NavigationElementsService) {
this.navigationService.updateIBOsNavigation$.subscribe((navigationData) => {
log.d('I received this Navigation Data:', JSON.stringify(navigationData));
this.id = navigationData;
}
);
}
ngOnInit() {
}
}
这个组件已经订阅,应该列出并接收数据...
让我们梳理一下 DI(依赖注入):
需要考虑到 IboDetailsGeneral
位于应用程序结构的较低层,因此 IboDetailsGeneral
是 IBOsNavigationElement
的子级。
这就是为什么我将 NavigationElementsService
添加到 IBOsNavigationElement
模块中的原因:
NavigationModule
是 IBOsNavigationElement
的模块
@NgModule({
imports: [
// A lot of stuff
],
declarations: [
// A lot of stuff
IBOsNavigationElement
],
exports: [
// A lot of stuff
],
providers: [
NavigationElementsService
]
})
控制台:
调用updateIBOsNavigation函数
updateIBOsNavigation "95"
再次调用updateIBOsNavigation函数
updateIBOsNavigation "test"
这些控制台结果告诉我:
- 方法正在被调用,所以没有提供者错误。 与服务的通信良好。
我的测试:
- 我尝试在
IBOsNavigationElement
(侦听器)中随机调用一个方法,并且与服务的通信良好。 NavigationElementsService
仅在NavigationModule
中添加到providers
中,因此只有一个服务实例,是吗?然后,以下链接中解释的问题不会发生:Angular 2 observable subscription not triggering
很抱歉我写了一堵文本墙,但目前我有点绝望。
感谢任何帮助,谢谢!
更新1:
在第一个回答之后,我尝试了几件事情...
使用ReplaySubject
:
@Injectable()
export class NavigationElementsService {
public updateIBOsNavigation$ = new ReplaySubject();
updateIBOsNavigation(navigationData) {
log.d('updateIBOsNavigation', JSON.stringify(navigationData));
this.updateIBOsNavigation$.next(navigationData);
}
}
结果:调用updateIBOsNavigation()
时,subscribe()
仍未触发。
使用BehaviorSubject
:
@Injectable()
export class NavigationElementsService {
updateIBOsNavigationSubject = new BehaviorSubject<any>('');
updateIBOsNavigation$ = this.updateIBOsNavigationSubject.asObservable();
updateIBOsNavigation(navigationData) {
log.d('updateIBOsNavigation', JSON.stringify(navigationData));
this.updateIBOsNavigationSubject.next(navigationData);
}
}
结果:在初始化时进入subscribe()
,但当我调用updateIBOsNavigation()
时,subscribe()
仍未触发。
使用BehaviorSubject
v2:
我尝试了这种方法:behaviourSubject in angular2 , how it works and how to use it
@Injectable()
export class NavigationElementsService {
public updateIBOsNavigation$: Subject<string> = new BehaviorSubject<string>(null);
updateIBOsNavigation(navigationData) {
log.d('updateIBOsNavigation', JSON.stringify(navigationData));
this.updateIBOsNavigation$.next(navigationData);
}
}
结果:与 BehaviorSubject
先前应用的结果相同。
更新2:
在整个网络上研究后,更多绝望尝试的示例...
使用 BehaviorSubject
v3:
@Injectable()
export class NavigationElementsService {
updateIBOsNavigation$: Observable<any>;
updateIBOsNavigationSubject = <BehaviorSubject<any>> new BehaviorSubject([]);
constructor() {
this.updateIBOsNavigation$ = this.updateIBOsNavigationSubject.asObservable();
}
updateIBOsNavigation(navigationData) {
log.d('updateIBOsNavigation()', JSON.stringify(navigationData));
this.updateIBOsNavigationSubject.next(navigationData);
}
}
结果:与之前的BehaviorSubject
尝试相同... 绝望正在上升...
更新3:
为了确保NavigationElementsService
是一个单例,我想要做个说明:
export class NavigationModule {
static forRoot() {
return {
ngModule: NavigationModule,
providers: [NavigationElementsService]
};
}
}
导入时:
imports: [
NavigationModule.forRoot()
]
结果:与以往一样的问题,subscribe()
未触发,但至少我知道有一个NavigationElementsService
实例。