У меня есть приложение Ionic (Cordova), к которому я только что добавил NgRx
, и мне нужно persist out this state
для автономной поддержки.
Я нашел ngrx-store-ionic-storage , который, казалось, делал это, поэтому я добавил, что при тестировании в браузере (ионная подача) я мог видеть, что состояние сохраняется в локальном хранилище.
Однако, когда я запускал на устройстве,состояние не похоже на регидратацию.
Я добавил журналирование, чтобы попытаться увидеть, что происходит. Я также поднял вопрос здесь с моими выводами, но я понятия не имею, насколько активен этот репо.
По сути, состояние, похоже, все сохраняется, но при запуске оно появляетсясохранить новое пустое состояние перед чтением в ранее сохраненном.
Мои вопросы
1. Кто-нибудь еще имел опыт работы с этой библиотекой и, возможно, знаетКод достаточно хорошо, чтобы иметь какие-либо предложения о том, как это исправить?
2. Если не указано выше, есть ли что-нибудь еще, чтобы сделать подобное?
Использование хранилища Ionic - отличный вариант, так как оно будет работать в браузере для тестирования (с использованием локального хранилища), но на устройстве оно перейдет в SQLite.
Заранее спасибо за любую помощь!
[Update1]
Я настроил вышеуказанное точно в соответствии с инструкциями ....
function onSyncError(err) {
Utils.logger.error(JSON.stringify(err));
}
const reducers: ActionReducerMap<any> = {
feature1: feature1Reducer,
feature2: fesature2Reducer,
};
const storageSyncReducer = storageSync({
keys: [
"feature1",
"feature2",
],
ignoreActions: [
"feature3"
],
hydratedStateKey: 'hydrated', // Add this key to the state
onSyncError: onSyncError // If a sync fails
});
export function storageMetaReducer(reducer: ActionReducer<any>): ActionReducer<any, any> {
return storageSyncReducer(reducer);
}
export const metaReducers: MetaReducer<any, any>[] = [storageMetaReducer];
@NgModule({
StoreModule.forRoot(reducers, {
metaReducers,
initialState: {
hydrated: false
}
}),
StoreModule.forFeature("feature1", feature1Reducer),
StoreModule.forFeature("feature2", feature2Reducer)
}
Как и в поднятой проблеме, я добавил ведение журналак коду ...
function saveState(state, keys) {
// Pull out the portion of the state to save.
if (keys) {
state = keys.reduce(function (acc, k) {
var val = getNested(state, k);
if (val) {
setNested(acc, k, val);
}
return acc;
}, {});
}
// Look at state before writing
console.log(" ----------- EXAMINE STATE before saving ----------");
fetchState().then(s => {
console.log("STATE before saving...: " + JSON.stringify(s));
console.log("----- Saving STATE: ------- " + JSON.stringify(state));
return storage.set(STORAGE_KEY, state);
});
var p = new Promise(resolve => {
resolve();
});
return p;
}
При запуске, когда я вижу console.log("STATE before saving...: " + JSON.stringify(s));
Iувидеть полное сохраненное ранее состояние.
Следующая строка ...
console.log("----- Saving STATE: ------- " + JSON.stringify(state));
Я вижу, как "начальное состояние" (пустое с начальными значениями) выходит из системы.
Итак. насколько я вижу, государство спасается. Я пытался (и потерпел неудачу) довольно долгое время, чтобы получить реальную базу данных SQLite с устройства, но из журналов (как указано выше), безусловно, кажется, что состояние сохранено.
[UPDATE2]
Я удалил свою запись в журнал, как я обнаружил, когда я добавил больше, это фактически решило проблему (возможно, это замедлило процесс).
Чтобы проверить содержимое хранилища нателефон, я добавил следующий код ... (хранилище данных - Ionic Storage)
this.messages = '';
this.dataStore.forEach((v, k) => {
this.messages += ('key: ' + k + ', value:' + JSON.stringify(v) + endOfString);
});
Когда я запускаю свое приложение в Интернете (поэтому я получаю свои данные, которые хочу сохранить в хранилище NgRx), я вижуследующий контент для вышеуказанного кода (я отображаю на странице) ...
Итак, здесь я могу видеть мои другие данные, отличные от NgRx,а также NgRx, хранящийся под ключом NSIS_APP_STATE .
Теперь я принудительно закрываю свое приложение (поэтому в памяти нет содержимого), снова открываю и затем снова проверяю хранилище Ionic. следующее ...
Теперь я все еще вижу все мои другие данные, нотеперь содержимое в NSIS_APP_STATE
пусто.
Теперь выполняется ionic serve (inbrowser).
Я загружаю данные приложения и вижу, что они сохранены. в хранилище браузера.
Я вижу все это там ...
Теперь я закрываю вкладку браузера, останавливаюсьи перезапустите ionic serve, и НЕ заходите на страницу, которая загружает данные, помещенные в хранилище NgRx , посмотрите на NSIS_APP_STATE
в локальном хранилище браузера, оно все еще там.
Итак, только при работе на реальном устройстве я, кажется, теряю его.
SQLite везде работает, теряются только данные NgRx.
Когда я добавилруда и консольная логистика, казалось, (по крайней мере, иногда) работают, так что, возможно, это какое-то состояние гонки ...