2017-10-13 104 views
1

我有兩個服務:SharedDataService(SDS)和FilterService(FS)。 SDS處理我的API資料。它爲我的用戶,員工,觀察購物。它還處理髮送到後端的東西。 FS處理很多,但不是屏幕上發生的所有事情。通過我的互動服務,我應該(如果我可以讓這個該死的東西工作)能夠根據輸入日期,員工,某些類別或所有或部分聯合在一起的內容來篩選我的列表。服務之間的角度4通信

現在,這是我的問題。你如何得到兩種服務相互交談?我需要來自SDS(用戶和觀察)的FS中的一些信息。我如何讓他們說話?

我已經試過:

//SharedDataService.ts 
    public observations: Observation[] = []; 
    private observationsSource = new BehaviorSubject<any>(this.observations); 
    observations$ = this.observationsSource.asObservable(); 

    public getObservations(jobcode: string, loc_name: string): 
    Observable<Observation[]> { 
     return this.http 
     .get(API_URL + '/quick-interactions/get-observations/' + jobcode + '/' + loc_name) 
     .map(response => { 
     this.observations = response.json(); 
     this.observations.map((observation) => new Observation(observation)); 
     return this.observationsSource.next(this.observations); 
     }) 
     .catch(this.handleError); 
    } 

    //FilterService 
    constructor(
     private sharedDataService: SharedDataServiceService 
    ) { 
     sharedDataService.employee$.subscribe(employee => { 
      this.employee = employee; 
     }); 

     sharedDataService.observations$.subscribe(observations => { 
      this.observations = observations; 
     }); 
    } 

但是,這並不讓我我需要什麼。我試過它只是一個Observable而不是BehaviorSubject。我甚至嘗試過直接調用shareObservations方法返回this.observations。他們都沒有工作。

任何人有任何明智的想法?

+1

你是對的,你不應該需要行爲主體。一個服務應該能夠使用依賴注入來訪問另一個服務,就像你在上面的代碼中一樣。你能詳細說明它是如何不工作的嗎? – DeborahK

+0

我有很多console.logs,我刪除了這個問題。當應用程序加載時,我可以在其中一箇中看到SDS已檢索到292個觀察值,但在FS中console.logs顯示爲「null」。所以即使安全數據單已經收到了觀察結果,他們也不會與FS共享。我猜測FS在SDS完成購物之前正在運行,但即使他們是可觀察的數據,數據也永遠不會到達FS。 –

+0

給我們更多的服務代碼片段。順便說一句,你有沒有在你的服務類之前放置'@Injectable()'? – asmmahmud

回答

0

如果你改變你的代碼看起來像這樣(現在沒有BehaviorSubject):

this.sharedDataService.getObservations.subscribe(observations => { 
     this.observations = observations; 
     console.log(this.observations); 
    }); 

用的console.log 的認購,其輸出未定義?

這裏是SDS在一個簡化版本:

public getObservations(jobcode: string, loc_name: string): 
Observable<Observation[]> { 
    return this.http 
    .get(API_URL + '/quick-interactions/get-observations/' + jobcode + '/' + loc_name) 
    .map(response => <Observation[]>response.json()) 
    .do(data => console.log(JSON.stringify(data)) 
    .catch(this.handleError); 
} 
+0

它輸出一個空數組。 –

+0

如果您將上述答案中顯示的所有額外behaviorSubject內容摘下,該怎麼辦。這是否改變了顯示? – DeborahK

+0

在FS中仍然給我一個空陣列,但是現在我的控制檯看起來跟所有的字符串化觀察都是一團糟。 –

1

我會跳過BehaviorSubject從成分完全,而是在FilterService調用一個方法,這在SharedDataService調用的方法,所以是這樣的:

組件:

constructor(private filterService: FilterService) { } 

ngOnInit() { 
    this.filterService.getMyData(jobcode: string, loc_name: string) 
    .subscribe(data => { 
     console.log(data); 
    }) 
} 

FilterService:

constructor(private sharedDataService: SharedDataService) { } 

getMyData(jobcode: string, loc_name: string) { 
    this.sharedDataService.getObservations(jobcode: string, loc_name: string) 
    .map(data => { 
     // do whatever you need to do with your data here, then return 
     return data; 
    }) 
} 

,然後最後SharedDataService從API獲取數據:

constructor(private http: Http) { } 

getObservations(jobcode: string, loc_name: string) { 
    return this.http.get('url here') 
    .map(response => response.json().map(res => new Observation(res)))) 
} 

這裏有一個DEMO一些不同的變量名稱等,但確實的同樣的東西:)