角4最佳实践:通过服务加载全局数据并将其存储
问题描述:
我想建立一个角4的应用程序,在那里我可以从数据库中搜索用户,并使用我在不同的路由发现的人的信息。我现在的问题是,如果我通过服务加载一些数据,更改路线并返回,数据将再次加载。角4最佳实践:通过服务加载全局数据并将其存储
我的服务:
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
@Injectable()
export class GlobalDataService {
cachedData: Observable<any>;
getData() {
if (this.cachedData) {
console.log('cache data found');
return Observable.of(this.cachedData);
} else {
console.log('cache data NOT found');
return this.http.get('https://56e05c3213da80110013eba3.mockapi.io/api/todos')
.map(res => res.json())
.do((data) => {
this.cachedData = data;
})
.share();
}
}
我的组件:
import { Component, OnInit } from '@angular/core';
import { FormBuilder, Validators} from '@angular/forms';
import { Http } from '@angular/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/map';
import { GlobalDataService } from '../../services/global-data.service';
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css'],
providers: [GlobalDataService]
})
export class DashboardComponent implements OnInit {
todos: Observable<any[]>;
constructor(private globalDataService: GlobalDataService) { }
ngOnInit() {
this.globalDataService.getData().subscribe(
(resp) => {
this.todos = resp;
}
);
}}
当我运行应用程序,我得到的console.log '未找到' 的数据被加载,因为它应该是,但是当我改变路线并切换回来时,它再次被装载,这是不正确的。
我希望你能帮助我,也许一个完整的工作示例,所以我可以看看代码。也许我错过了一些东西。
如果您需要了解更多信息,请随时问。
答
你有服务提供多次?您只应该注册一次服务。
我看到它在你的仪表板组件:
providers: [GlobalDataService]
你有它列出像这样的任何其他组件或模块?
要共享服务,应当只登记了一个时间:
- 无论在组件树的根(如应用程序组件)
- 或模块,而不是一个组件英寸
如果您多次注册它,它将不能作为单例使用,并且您不会获得共享数据。
貌似https://*.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an-angular-2-http-network-的DUP叩/ 36291681#36291681我 –
走了[共享服务](https://rahulrsingh09.github.io/AngularConcepts/faq)或或使用本地存储,以及向服务的调用之前检查。 –