2016-04-05 3 views
0

Учитывая следующий код (тестовый код), что является лучшим способом иметь только один вызов требуемого файла? В настоящее время при каждом нажатии кнопки выполняется запрос XHR.Угловое 2 Кэширование Http

import {Injectable} from 'angular2/core'; 
import {Http} from 'angular2/http'; 

@Injectable() 
export class MyService { 
    constructor(private http: Http) {} 
    getList() { 
     return this.http.get('./public/data.json') 
      .map(res => res.json()); 
    } 
    getOne(id: number) { 
     return this.getList() 
      .map(data => data.filter(my => my.id === id)[0]); 
    } 
} 

Вот файл с данными JSon

[ 
    {"id": 1, "name": "Data 1"}, 
    {"id": 2, "name": "Data 2"}, 
    ... 
] 

Вот файл компонента. Он использует простой файл модели (который является только класс с идентификатора и имени свойства)

import {Component} from 'angular2/core'; 
import {MyService} from 'my-service'; 
import {MyModel} from 'my-model'; 

@Component({ 
    selector: 'test', 
    templateUrl: ` 
     <button (click)="getRandom()">Test</button> 
     <p>{{ selected.name }} ({{ selected.id }})</p> 
    ` 
}) 
export class MyComponent { 
    selected: MyModel; 
    constructor(private myService: MyService) {} 
    getRandom() { 
     let id = Math.floor((Math.random() * 10) + 1); 
     this.myService.getOne(id) 
      .subscribe((data: MyModel) => this.selected = data); 
    } 
} 

Я не прикладывая здесь весь материал для начальной загрузки приложения. Но это показывает эту идею.

Большое спасибо

ответ

8

Вы могли бы эффективно использовать do оператор кэшировать данные, полученные в первый раз в собственности службы:

@Injectable() 
export class MyService { 
    private data:any; 

    constructor(private http: Http) {} 

    getList() { 
    if (this.data) { 
     return Observable.of(this.data); 
    } else { 
     return this.http.get('./public/data.json') 
     .map(res => res.json()) 
     .do(data => { 
      this.data = data; 
     }); 
    } 
    } 

    getOne(id: number) { 
    return this.getList() 
     .map(data => data.filter(my => my.id === id)[0]); 
    } 
} 
+0

я пропускал концепцию Observable.of. Благодаря! – rekam

+0

лучший ответ, когда-либо возникавший в stackoverflow. Одна вещь, которую нужно разобраться, пожалуйста, в чем разница между do и subscribe? – user2080105

+1

@ user2080105 'do()' запускается как побочный эффект наблюдаемого ([docs] (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-do)). Он фактически не работает до тех пор, пока что-нибудь еще не подпишет() для наблюдаемого. – jessepinho

Смежные вопросы