Я использую CacheService с моим экраном поиска, который содержит множество раскрывающихся значений. Это работает, только если вы установите кеш для одного раскрывающегося списка, он не будет работать, если вы установите кеш для более чем одного, даже если у них разные ключи. Думаю, мне нужно создать новый экземпляр службы кеширования
пример:
constructor(private _appParams: AppParamasService,private _cacheService: CacheService) {
}
getUserLocations(ID: string, allList: string) {
let userLocationsCache: string;
let res: any | null = this._cacheService.get(userLocationsCache);
if (res) {
this.results = res;
}
else {
this._appParams.getUserLocations(ID, allList)
.subscribe(
data => {
this.results = data.result;
this._cacheService.set(userLocationsCache, data.result);
},
error => this.showMessage(' Method: ' + <any>error, 0));
}
}
getAllStatuses() {
let statusCache: string = "";
let res1: any | null = this._cacheService.get(statusCache);
if (res1) {
this.iStatuses = res1;
}
else {
this._appParams.getStatuses()
.subscribe(
data => {
this.iStatuses = data.result;
this._cacheService.set(statusCache, data.result);
},
error => this.showMessage(' Method: ' + <any>error, 0));
}
}
ошибка
ERROR TypeError: Cannot read property 'toString' of undefined
*************************************************ОБНОВИТЬ ************************************************* **** Я вынул CacheService из модуля приложения и добавил объявление на уровне компонентов ... но это не сработало.
import { CacheService } from 'ng2-cache-service';
@Component({
selector: 'search',
moduleId: module.id,
templateUrl: 'search.component.html',
providers: [CacheService]
})
export class SearchComponent implements OnInit {
constructor(private _appParams: AppParamasService,private _cacheService: CacheService) {
}
getUserLocations(PNSLUID: string, allList: string) {
let userLocationsCache: string;
let res: any | null = this._cacheService.get(userLocationsCache);
if (res) {
this.results = res;
}
else {
this._appParams.getUserLocations(ID, allList)
.subscribe(
data => {
this.results = data.result;
this._cacheService.set(userLocationsCache, data.result);
},
error => this.showMessage(' Method: ' + <any>error, 0));
}
}
getAllStatuses() {
let statusCache: string = "";
let res1: any | null = this._cacheService.get(statusCache);
if (res1) {
this.iStatuses = res1;
}
else {
this._appParams.getStatuses()
.subscribe(
data => {
this.iStatuses = data.result;
this._cacheService.set(statusCache, data.result);
},
error => this.showMessage(' Method: ' + <any>error, 0));
}
}
ts service
import { environment } from 'environments/environment';
@Injectable()
export class AppParamasService {
constructor(private _http: Http) {
}
getStatuses() {
return this._http.get(environment.BASE_API_URL + 'GetAllStatuses/')
.map((response: Response) => response.json())
.catch(this.handleError);
}
getUserLocations(a: string, allList: string) {
return this._http.get(environment.BASE_API_URL + 'GetUserLocations/' + a + '/' + allList)
.map((response: Response) => response.json())
.do(data => console.info('loctions ' + JSON.stringify(data)))
.catch(this.handleError);
}
да, и я вынул его ... см. мой обновленный код выше ... обратите внимание, что он работает, если я делаю это только для одного раскрывающегося списка
не могли бы вы опубликовать код для службы кеширования, пожалуйста
добавил сервис





Если вы просто вставите свою службу (или любой @ Инъекционный) в конструктор, Angular поднимется по дереву компонентов / модулей и будет искать поставщиков для вашей службы. Весьма вероятно, что вы добавили свою службу в массив поставщиков модуля. Это приведет к созданию одноэлементной службы, которая используется везде, где вы вводите эту службу внутри этого модуля.
Если вы действительно хотите использовать независимый экземпляр своей службы для своего компонента, вы можете добавить службу в массив поставщиков вашего компонента, например:
@Component({
selector: 'my-component',
templateUrl: './my-component.component.html',
styleUrls: [ './my-comppnent.component.css' ],
providers: [CacheService]
})
export class MyComponent {
...
все равно это не сработало .. та же ошибка .. обновил мой код выше
Я не знаю точной структуры вашего компонента, но я думаю, что ваши выпадающие элементы должны быть независимыми компонентами, каждый из которых получает свой собственный экземпляр CacheService (через поставщиков компонентов).
bu в раскрывающемся списке вашего примера - это отдельный компонент, а не раскрывающийся список вместе со всеми другими элементами управления в одном компоненте .. не уверен, как это подойдет моему проекту
Я действительно думаю, что это правильный путь, если вы хотите получить отдельный экземпляр своей службы для каждого из своих раскрывающихся списков.
да, но это усложнит проект, должен быть способ попроще .. Или есть еще одна услуга, которую я могу использовать?
один из способов сделать это - ввести несколько экземпляров в конструктор, в каждом раскрывающемся списке используется один экземпляр, такой как этот конструктор (частный _appParams: AppParamasService, частный _cacheService: CacheService, частный _cacheService2: CacheService)
но я не уверен, эффективен ли этот способ "аспект производительности"
На самом деле я считаю, что разбиение представлений на небольшие повторно используемые компоненты - это хорошо и делает приложение менее сложным, но это больше мое мнение. Внедрение нескольких экземпляров вашего сервиса тоже должно работать, почему вы ожидаете здесь проблем с производительностью?
Я не ожидаю проблем с производительностью, но хотел дважды проверить, если что-то не хватает
если вы выставили CacheService в качестве поставщика в app.module.ts