Удаление элемента и его дочерних элементов в ngrx

Я новичок в магазине ngrx и смущен размещением логики, т.е. должен ли цикл через массив переходить к редуктору или компоненту. У меня есть массив объектов типа Item, и мне нужно удалить элемент. При удалении элемента я должен удалить ссылку на него в parent'children, а также всех его дочерних элементах.

    export class Item {
      id: string;
      message: string;
      children: string[];
    }

Свойство children элемента Item содержит идентификаторы объектов самого типа Item.

    Items: Item[] = [
     {id: "1", "message": "First Message" , children:["4","5"]},
     {id: "2", "message": "Seccond message" , children:["3"]},
     {id: "3", "message": "First child Message" , children:[]},
     {id: "4", "message": "Seccond child message" , children:["6"]},
     {id: "5", "message": "third child message" , children:[]},
     {id: "6", "message": "child message" , children:[]},
    ]

Мне нужно удалить элемент и соответствующие дочерние элементы из массива при отправке действия "DeleteItemByID", например, если я удаляю элемент с id=4, он обновляет элемент с id ="1" и удаляет "4" из его детский массив. Затем действие удаления удаляет дочерние элементы элемента, который является элементом с id="6", а затем, наконец, удаляет элемент с id="4".

    Items: Item[] = [
     {id: "1", "message": "First Message" , children:["5"]},
     {id: "2", "message": "Seccond message" , children:["3"]},
     {id: "3", "message": "First child Message" , children:[]},
     {id: "5", "message": "third child message" , children:[]},
    ]

    export class DeleteItemByID implements Action {
        readonly type = "DeleteById";
     /**
      * Constructor
      * @param payload The id of the discussion to remove
      */
        constructor(public payload: string) { }
    }

    /*App state*/
    export class AppState{
        items: Item[]
    }

    /* reducer */
    export function reducer(state: AppState = [], action  ) : AppState{
       switch (action.type) {
            case "DeleteById":
                /* Delete Logic*/
                return {};
            default:
                return state;
    }

Помогите мне выбрать лучший подход, который я должен использовать для операции удаления.

1 ответ

Правильный ответ будет отличаться от случая к случаю,

Случай 1:- Если вы хотите повторно использовать это поведение удаления в нескольких местах, то есть в нескольких компонентах / службах. Создайте два разных действия, то есть DeleteChildrenItemById и DeleteItemById.

ИЛИ

Вы можете создать метод службы, который удалит необходимые элементы из массива и отправит весь новый массив в редуктор для замены существующего, что поможет вам избежать сложного входа в редуктор.

Случай 2:- Если такое поведение требуется только для этого компонента, выполните удаление в компоненте и отправьте этот новый массив редуктору.

Другие вопросы по тегам