ngxs选择性地序列化数组中的属性

时间:2019-04-25 09:54:01

标签: angular ngxs

我有一个AccountState,用于存储帐户列表。必须将AccountState序列化到本地存储,因此我使用Storage Plugin

但是,我不想序列化帐户的每个属性。例如,我要序列化用户名而不是密码。

现在,我像这样导入存储插件:

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

所以我可以定义必须使用username属性而不是password属性序列化数组吗?

1 个答案:

答案 0 :(得分:1)

我认为没有办法仅通过配置来做到这一点。但是,您可以提供自己的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并在序列化之前删除不需要的值。