我有一个角度服务,用作从数据库中获取数据的中点。 这是它:
export class WebService {
constructor(private http: Http, private datePipe: DatePipe) {
this.getStatsbyDate(this.datePipe.transform(new Date(), 'dd-MM-yyyy'));
}
statsModel = {
date: this.datePipe.transform(new Date(), 'dd-MM-yyyy'),
answeringMachine:0,
hangUp: 0,
conversations: 0
};
getStatsbyDate(date) {
this.http.get(this.BASE_URL + '/stats/' + date)
.subscribe(
res => {
this.btnsOnResponse = true;
this.statsModel = res.json();
// console.log(this.statsModel);
},
err => {
console.log("Couldn't fetch data")
}
);
}
我试图以这种方式访问我的一个角度组件中的获取数据
export class FusionChartsComponent implements OnInit {
constructor(private webService: WebService) {}
ngOnInit() {
console.log(this.webService.statsModel.answeringMachine);
}
}
我不确定为什么会发生这种情况。 请指教!
答案 0 :(得分:2)
如此处的文档所示:https://angular.io/guide/http,将订阅移动到组件。然后,您可以在订阅中添加所需的任何代码。
getStatsbyDate(date) {
this.http.get(this.BASE_URL + '/stats/' + date)
.pipe(
tap(res => {
this.btnsOnResponse = true;
this.statsModel = res.json();
// console.log(this.statsModel);
}),
catchError(err => console.log("Couldn't fetch data"))
);
}
export class FusionChartsComponent implements OnInit {
constructor(private webService: WebService) {}
ngOnInit() {
this.webService.getStatsbyDate().subscribe(
data => {
console.log(data);
console.log(this.webService.statsModel.answeringMachine);
});
}
}
修改
如果您需要服务保留其数据以与其他组件共享,您可以执行以下操作:
@Injectable()
export class MovieService {
private moviesUrl = 'api/movies';
private movies: IMovie[];
constructor(private http: HttpClient) { }
getMovies(): Observable<IMovie[]> {
if (this.movies) {
return of(this.movies);
}
return this.http.get<IMovie[]>(this.moviesUrl)
.pipe(
tap(data => console.log(JSON.stringify(data))),
tap(data => this.movies = data),
catchError(this.handleError)
);
}
}
每个组件都可以这样订阅:
this.movieService.getMovies().subscribe(
(movies: IMovie[]) => this.movies = movies,
(error: any) => this.errorMessage = <any>error
);
调用该服务的第一个组件将使其发送将获取数据的http get请求。然后它将该数据存储在私有属性中。所有其他调用都获取已检索的数据(如if
块中所示)。
由于所有组件都是订阅的,因此您可以在subscribe
方法中添加任何代码。在具有所需数据之前,该代码将不会执行。
大多数开发人员认为尽可能靠近UI进行订阅是“最佳实践”。这也使得编写仅在返回数据后执行的代码变得更加容易。
我在这里有一个完整的例子:https://github.com/DeborahK/MovieHunter-communication/tree/master/MH-Take4