Angular 2, лучше всего загружать данные с сервера один раз и делиться результатами с компонентами
Какова наилучшая практика хранения (и совместного использования) начальных значений в приложении Angular 2 с использованием службы?
У меня есть служба, которая загружает много данных с сервера в виде ресурсов, конфигураций и других, которые являются массивом и объектами.
Я не хочу загружать эти данные каждый раз, когда я загружаю компонент или когда я направляюсь к представлению, я просто хочу использовать эти объекты и массив, уже загруженные при запуске приложения, и при необходимости перезагружать, если это необходимо.
Вопрос в том, где правильно хранить эти значения и как делиться между компонентами, использующими эту услугу?
Спасибо.
Ответы
Ответ 1
Вы должны подумать о общедоступной службе и убедитесь, что только один отдельный экземпляр разделяется между компонентами.
общая служба и демонстрация общих объектов
Примечание.
не забудьте зарегистрировать услугу в загрузочной функции. Соблюдайте код глубоко. вы получите то, что хотите. Часть маршрутизации не показана. Surf plunk для дальнейшей реализации
service.ts
import {Component, Injectable,Input,Output,EventEmitter} from 'angular2/core'
import {Router} from 'angular2/router';
import {Http} from 'angular2/http';
export interface Info {
name:string;
}
@Injectable()
export class NameService {
constructor(http:Http;router:Router)
{
this.http=http;
// you can call server resource from here and store it down to any variable.
}
info: Info = { name : "Jack" };
change(){
this.info.name = "Jane"; // this.info is shared among components.
}
}
Ответ 2
Gunter совершенно прав в отношении общих сервисов!
Ниже приведена подробная информация о HTTP, который использует наблюдаемые и кэшированные данные для следующих вызовов:
export class SharedService {
constructor(private http:Http) {
}
getData() {
if (this.cachedData) {
return Observable.of(this.cachedData);
} else {
return this.http.get(...)
.map(res => res.json())
.do((data) => {
this.cachedData = data;
});
}
}
}
Ответ 3
Правильное место, безусловно, является сервисом. Если вы добавите эту услугу в качестве поставщика только в одном месте, один экземпляр будет совместно использоваться всем приложением. Если вы добавите его поставщикам на каждый компонент, каждый компонент получит свой собственный экземпляр - это то, чего вы хотите избежать.
bootstrap(AppComponent, [HTTP_PROVIDERS, MyService]);
@Component({
selector: 'some-comp',
providers: [/* don't add MyService here !! */]})
class MyComponent {}