替换集合中实体的最干净方法

时间:2019-01-29 21:14:55

标签: typescript ngrx ngrx-entity

实体适配器支持使用“ 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将会是有益的。

2 个答案:

答案 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 { }

Here is full documentation.

setOne(payload, state);

答案 1 :(得分:0)

您将必须使用upsertOneupsertAll方法-请参见NgRx docs

upsertOne: Add or Update one entity in the collection
upsertMany: Add or Update multiple entities in the collection