实体适配器支持使用“ updateOne”方法调用来更新集合。但是,当不存在更新值的键时,这将导致特定实体不被更新。参见代码示例。
但是,在内部,实体适配器使用Object.assign()
,虽然不错,但并非总是我想要的。我希望它可以基本上替换所涉及的实体。
此外,如果所讨论的对象具有结构A(请参见下文)。然后发生了一些任意的数据库操作,并将更新的JSON返回前端。减速器最终将以表格的形式获取该信息。
const originalValue: MyClass = new MyClass('value 1', 'value 2');
const updatedValueFromServer: MyClass = new MyClass('updated');
Then internally to the entity adapter it looks like
const updateValue = Object.assign(originalValue, updatedValueFromServer);
// which would result in ...
// { key1: 'updated', key2: 'value 2' }
// while I would like
// { key1: 'updated' }
// Or
// { key1: 'updated', key2: null }
case ActionTypes.UPDATE_SUCCESS:
return collectionAdapter.updateOne({
changes: action.payload.alertSubscription,
id: action.payload.alertSubscription.uniqueID
}, {
...state,
isLoading: false,
error: null
});
export class MyClass {
constructor(public key1?: string, public key2?: string) { }
}
我希望它只是替换集合中的值,而不是尝试通过内部调用“ Object.assign()”来进行较差的更新。另外,以某种方式将对象中的键设置为null将会是有益的。
答案 0 :(得分:1)
setOne是必经之路。
const routes: Routes = [
{
path:'dashboard',
component :DashboardPage
},
{
path: '',
redirectTo: 'dashboard',
pathMatch: 'full'
},
];
@NgModule({
imports: [
RouterModule.forRoot(routes, { enableTracing: true, preloadingStrategy: PreloadAllModules })
],
exports: [RouterModule]
})
export class AppRoutingModule { }
setOne(payload, state);
答案 1 :(得分:0)
您将必须使用upsertOne
或upsertAll
方法-请参见NgRx docs
upsertOne: Add or Update one entity in the collection
upsertMany: Add or Update multiple entities in the collection