我已经在我的应用程序中多次完成此操作。这很简单,它应该工作...但是这次它不。Angular 2:Observable/Subscription not triggereding
我的问题:
我打电话对组件进行服务的方法,我组分B认购,但没有反应,也没有收到任何东西。 subscribe()
不会触发!
导航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
处于下层在App的结构上,所以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
]
})
控制台:
CALLING updateIBOsNavigation功能
updateIBOsNavigation “95”
CALLING updateIBOsNavigation功能AGAIN
updateIBOsNavigation “测试”
此控制台结果却对我说:
- 的方法被调用,所以没有提供者错误。 与服务沟通OK。
我的测试:
- 我已经打过电话随机方法
IBOsNavigationElement
(听众),并与服务之间的通信正常。 NavigationElementsService
被添加到providers
的唯一地方是NavigationModule
,因此只有一个服务实例是正确的?然后,问题下面的链接解释不会发生: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()
不会触发,但在le因为我知道有一个NavigationElementsService
的实例。
我加入更新与我绝望的尝试...请结束我的折磨! xD – SrAxi
嗨,你现在是否解决了这个问题? –
@BonesandTeeth是的!谢谢! :D – SrAxi