Хранилище постоянного состояния NgRx для приложения Ionic 4 - PullRequest
0 голосов
/ 24 октября 2019

У меня есть приложение 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), я вижуследующий контент для вышеуказанного кода (я отображаю на странице) ...

enter image description here

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

Теперь я принудительно закрываю свое приложение (поэтому в памяти нет содержимого), снова открываю и затем снова проверяю хранилище Ionic. следующее ...

enter image description here

Теперь я все еще вижу все мои другие данные, нотеперь содержимое в NSIS_APP_STATE пусто.

Теперь выполняется ionic serve (inbrowser).

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

Я вижу все это там ...

enter image description here

Теперь я закрываю вкладку браузера, останавливаюсьи перезапустите ionic serve, и НЕ заходите на страницу, которая загружает данные, помещенные в хранилище NgRx , посмотрите на NSIS_APP_STATE в локальном хранилище браузера, оно все еще там.

Итак, только при работе на реальном устройстве я, кажется, теряю его.

SQLite везде работает, теряются только данные NgRx.

Когда я добавилруда и консольная логистика, казалось, (по крайней мере, иногда) работают, так что, возможно, это какое-то состояние гонки ...

...