Angular создание нового экземпляра CacheService

Я использую 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);
     }

если вы выставили CacheService в качестве поставщика в app.module.ts

BRAHIM Kamel 07.09.2018 22:28

да, и я вынул его ... см. мой обновленный код выше ... обратите внимание, что он работает, если я делаю это только для одного раскрывающегося списка

rgoal 07.09.2018 22:48

не могли бы вы опубликовать код для службы кеширования, пожалуйста

BRAHIM Kamel 07.09.2018 23:12

добавил сервис

rgoal 08.09.2018 00:34
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
4
203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы просто вставите свою службу (или любой @ Инъекционный) в конструктор, Angular поднимется по дереву компонентов / модулей и будет искать поставщиков для вашей службы. Весьма вероятно, что вы добавили свою службу в массив поставщиков модуля. Это приведет к созданию одноэлементной службы, которая используется везде, где вы вводите эту службу внутри этого модуля.

Если вы действительно хотите использовать независимый экземпляр своей службы для своего компонента, вы можете добавить службу в массив поставщиков вашего компонента, например:

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
  styleUrls: [ './my-comppnent.component.css' ],
  providers: [CacheService]
})
export class MyComponent {
...

все равно это не сработало .. та же ошибка .. обновил мой код выше

rgoal 07.09.2018 22:47

Я не знаю точной структуры вашего компонента, но я думаю, что ваши выпадающие элементы должны быть независимыми компонентами, каждый из которых получает свой собственный экземпляр CacheService (через поставщиков компонентов).

glutengo 07.09.2018 22:52

bu в раскрывающемся списке вашего примера - это отдельный компонент, а не раскрывающийся список вместе со всеми другими элементами управления в одном компоненте .. не уверен, как это подойдет моему проекту

rgoal 08.09.2018 00:25

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

glutengo 10.09.2018 12:07

да, но это усложнит проект, должен быть способ попроще .. Или есть еще одна услуга, которую я могу использовать?

rgoal 10.09.2018 18:46

один из способов сделать это - ввести несколько экземпляров в конструктор, в каждом раскрывающемся списке используется один экземпляр, такой как этот конструктор (частный _appParams: AppParamasService, частный _cacheService: CacheService, частный _cacheService2: CacheService)

rgoal 10.09.2018 19:12

но я не уверен, эффективен ли этот способ "аспект производительности"

rgoal 10.09.2018 19:13

На самом деле я считаю, что разбиение представлений на небольшие повторно используемые компоненты - это хорошо и делает приложение менее сложным, но это больше мое мнение. Внедрение нескольких экземпляров вашего сервиса тоже должно работать, почему вы ожидаете здесь проблем с производительностью?

glutengo 11.09.2018 09:19

Я не ожидаю проблем с производительностью, но хотел дважды проверить, если что-то не хватает

rgoal 11.09.2018 17:37

Другие вопросы по теме