Самый чистый способ заменить сущность в коллекции - PullRequest
0 голосов
/ 30 января 2019

Entity Adapter поддерживает обновление коллекции с помощью вызова метода «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 для ключей.

1 Ответ

0 голосов
/ 30 января 2019

Вам придется использовать метод upsertOne или upsertAll - см. NgRx документы

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