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

ngxs selectively serialize properties in array

我有一个存储帐户列表的 AccountState。 AccountState 必须序列化到本地存储,所以我使用 Storage Plugin

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

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

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

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

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