我已經在我的應用程序中多次完成此操作。這很簡單,它應該工作...但是這次它不。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