#angular #ngxs #angular-state-managmement
Вопрос:
Итак, я пытаюсь использовать NGXS в первый раз, и я заметил, что когда я добавляю следующий код в ngOnInit()
функцию Angular, он всегда извлекает API:
this.store.dispatch(new FooActions.GetAll());
Это может показаться глупым вопросом, но разве NGXS не должен проверять, есть ли в хранилище уже данные, и использовать их вместо вызова API?
Или это не является частью функции? И должен ли я просто выполнять проверку вручную каждый раз, когда отправляю действие для получения данных с сервера?
Комментарии:
1. Это не так, вам придется проверять вручную.
Ответ №1:
Итак, здесь есть две вещи, которые будут сделаны, чтобы уменьшить вызов API. Когда вы выполняете вызов API, браузер извлекает данные, и если кэш включен, он сохраняет данные в кэше.
Теперь, когда вы используете управление состоянием, вам необходимо сохранять данные API в хранилище каждый раз, когда вы обновляете или перезагружаете приложение, поскольку оно не является постоянным хранилищем для ваших данных.
Это означает, что перед вызовом API вы должны проверить, есть ли у вас данные в хранилище или нет. Если у вас есть данные, просто извлеките их из хранилища и следуйте тому же потоку приложений, иначе попадете в API, получите свежие данные и сохраните их в хранилище.
Комментарии:
1. Да, я понимаю, что он не сохраняется при перезагрузке. Но когда вы просто перемещаетесь по маршрутам Angular, я подумал, что идея заключалась в том, чтобы просто использовать хранилище и просто извлекать данные из API, когда хранилище пустое. Я имею в виду, по крайней мере, автоматически.
2. Это может выполняться автоматически, если вы создаете эту функциональность. Вы можете создать службу, которая может проверять перед каждым вызовом API или добавить службу перехвата для каждого вызова API, есть ли в хранилище эти данные или нет.
Ответ №2:
вы можете использовать selectSnapshot
selectSnapshot(StateName.SelectorName);
пример
const dataInsdeStore = this.store.selectSnapshot(StateName.SelectorName);
if (!dataInsdeStore) {
this.store.dispatch(new FooActions.GetAll());
}
- если
dataInsdeStore
возвращаемые данные, в хранилище уже есть данные, и вам
не нужно вызывать API - если
dataInsdeStore
возвращает значение null или empty, вам нужно вызвать API, потому что состояние пустое
ресурс для selectSnapshot