【发布时间】:2016-08-13 16:01:18
【问题描述】:
我有一个数据服务,它通过 HTTP(由某些组件触发)运行查询,然后通过 Observable 公开结果。其他组件将订阅该Observable 并更新其结果视图。
无论如何,这就是想法,但它不起作用。这是我的代码。
ItemListDataService:
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable, Subject } from "rxjs";
import 'rxjs/add/operator/map';
@Injectable()
export class ItemListDataService {
private issues$: Subject<any>;
constructor(private http: Http) {
this.issues$ = new Subject();
this.issues$.subscribe(x => console.log('GOT IT', x));
}
getList(): Observable<any> {
return this.issues$;
}
refresh() {
this.http.get('/whatever')
.map((response: Response) => response.json())
.subscribe(data => this.issues$.next(data));
}
}
ItemListComponent:
import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { ItemListDataService } from './item-list-data-service';
@Component({
selector: 'app-item-list',
templateUrl: './item-list.component.html',
styleUrls: ['./item-list.component.css'],
providers: [ItemListDataService]
})
export class ItemListComponent {
data: any;
constructor(itemListDataService: ItemListDataService) {
itemListDataService.getList().subscribe(data => {
console.log('DATA CHANGED');
this.data = data;
}, err => {
console.log('ERR', err)
}, () => {
console.log('DONE');
});
}
}
每次调用refresh() 时都会调用在ItemListDataService.constructor 中创建的订阅者。唯一不起作用的是组件中的订阅 - 那里从未调用任何回调。
我做错了什么?
【问题讨论】:
-
Woo 调用 refresh()?它从哪里获得 ItemListDataService?您已将 ItemListDataService 添加到 ItemListComponent 的提供者中,因此该组件(及其子组件)将获得自己的服务实例,与其他组件不同。
-
@JBNizet 谢谢,经过一些研究,我得出了同样的结论。事实上,问题在于每个组件都有自己的服务实例。来自 Angular 1(和许多其他 DI 框架),我期待它们是单例的。活到老,学到老。 :-) 随意张贴作为答案。