2017-10-13 152 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一些不同的变量名称等,但确实的同样的东西:)