Самый чистый способ заменить объект в коллекции

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.


person 2manyints    schedule 29.01.2019    source источник
comment
Вы нашли решение?   -  person Igor Janković    schedule 11.07.2019


Ответы (2)


setOne - это то, что вам нужно.

setOne(payload, state);

Вот полная документация.

addOne: Add one entity to the collection
addMany: Add multiple entities to the collection
setAll: Replace current collection with provided collection
setOne: Add or Replace one entity in the collection
removeOne: Remove one entity from the collection
removeMany: Remove multiple entities from the collection, by id or by predicate
removeAll: Clear entity collection
updateOne: Update one entity in the collection. Supports partial updates.
updateMany: Update multiple entities in the collection. Supports partial updates.
upsertOne: Add or Update one entity in the collection. Supports partial updates.
upsertMany: Add or Update multiple entities in the collection. Supports partial updates.
map: Update multiple entities in the collection by defining a map function, similar to Array.map
person Mukus    schedule 15.06.2020
comment
Обратите внимание, что это было добавлено в @ ngrx / entity @ 9.x - person Jeff Mercado; 13.10.2020

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

upsertOne: Add or Update one entity in the collection
upsertMany: Add or Update multiple entities in the collection
person timdeschryver    schedule 30.01.2019
comment
upsert (или update) не заменяет объект, он фактически расширяет объект, заменяя существующие поля, добавляя новые поля и оставляя старые поля - person Kornel Dylski; 11.02.2020