角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 '未找到' 的数据被加载,因为它应该是,但是当我改变路线并切换回来时,它再次被装载,这是不正确的。

我希望你能帮助我,也许一个完整的工作示例,所以我可以看看代码。也许我错过了一些东西。

如果您需要了解更多信息,请随时问。

+1

貌似https://*.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an-angular-2-http-network-的DUP叩/ 36291681#36291681我 –

+1

走了[共享服务](https://rahulrsingh09.github.io/AngularConcepts/faq)或或使用本地存储,以及向服务的调用之前检查。 –

你有服务提供多次?您只应该注册一次服务。

我看到它在你的仪表板组件:

providers: [GlobalDataService] 

你有它列出像这样的任何其他组件或模块?

要共享服务,应当只登记了一个时间:

  • 无论在组件树的根(如应用程序组件)
  • 或模块,而不是一个组件英寸

如果您多次注册它,它将不能作为单例使用,并且您不会获得共享数据。