ngxs выборочно сериализует свойства в массиве - PullRequest
0 голосов
/ 25 апреля 2019

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

Однако я не хочу сериализовать каждое свойство учетных записей. Например, я хочу сериализовать имя пользователя, но не пароль.

Сейчас я импортирую плагин Storage следующим образом:

NgxsStoragePluginModule.forRoot({
    key: [
        'account.accounts',
        'account.accounts.username' // <-- not working as accounts is an array not an object
    ]
})

Так можно ли определить, что массив должен быть сериализован со свойством username, а не со свойством password?

1 Ответ

1 голос
/ 28 апреля 2019

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

import { NgxsStoragePluginModule, StorageEngine, STORAGE_ENGINE } from '@ngxs/storage-plugin';

export class MyStorageEngine implements StorageEngine {
    get length(): number {
        // Your logic here
    }

    getItem(key: string): any {
        // Your logic here
    }

    setItem(key: string, val: any): void {
        // remove undesired values here
        let state = JSON.parse(val)
        state.accounts.accounts.forEach(acc => delete acc.password);
        localStorage.setItem(key, JSON.stringify(state));
    }

    removeItem(key: string): void {
        // Your logic here
    }

    clear(): void {
        // Your logic here
    }
}

@NgModule({
    imports: [
        NgxsModule.forRoot([]),
        NgxsStoragePluginModule.forRoot()
    ],
    providers: [
        {
        provide: STORAGE_ENGINE,
        useClass: MyStorageEngine
        }
    ]
})
export class MyModule {}

Хотя я бы не рекомендовал этот подход, поскольку он потребует больших накладных расходов из-за дополнительной (де) сериализации.

Другим способом было бы ввести самописный плагин, который заменяет StoragePlugin и удаляет нежелательные значения перед их сериализацией.

...