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 并在序列化之前删除不需要的值。
我有一个存储帐户列表的 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 并在序列化之前删除不需要的值。