Должны ли объекты ngrx храниться на уровне функций или на уровне приложений?

#angular #ngrx #ngrx-store #ngrx-entity

#угловатый #ngrx #ngrx-store #ngrx-entity

Вопрос:

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

В этом приложении я определил следующие функции:

  • Доска (список досок канбана)
  • Управление проектами
  • Управление проблемами
  • Панель мониторинга (обзор всех функций / проектов / плат / настроек / других)

Итак, моя структура папок может выглядеть следующим образом:

 - board (feature module)
- core
- dashboard (feature module)
- issue (feature module)
- project (feature module)
- shared
- app.component.ts
- app-routing.module.ts
- app.module.ts
 

У меня также есть набор объектов (сохраненных с использованием модуля объектов ngrx). Эти объекты довольно очевидны: проекты, проблемы, платы.

С чем у меня возникли проблемы, так это с поиском наилучшего способа хранения объектов в моем хранилище, особенно потому, что они разделяются между моими разными модулями. Например:

  • Приборной панели нужны объекты правления, проекта и выпуска.
  • Плате нужны объекты board, project и issue.
  • Проекту нужны объекты project и issue.
  • Проблема нуждается в объектах проблемы.

Должны ли эти объекты храниться на уровне модуля функций или, скорее, на уровне корневого хранилища?

Если я сохраню их на уровне функций, это может выглядеть так:

 {
  "board": {
    "boardEntities": {
      "0" {
        "id": 0,
        "projectId": 1,
        "name": "My super board",
        "configuration": { ... }
      }
    }
  },
  "projects": {
    "projectEntities": {
      "1": {
        "id": 1,
        "name": "my project",
        "issueIds": [0, 1, 2, 3, 4], // all issues of this project
        "owner": "owner" 
      }
    }
  },
  "issues": {
    issueEntities: { 
      "0": {
        // ...
      }
    }
  }
}
 

Но тогда часть загрузки довольно неудобна. Например, когда моя панель мониторинга пытается отобразить проблемы, они могут быть еще не в моем состоянии. Я отправлю действие, подобное new fromDashboard.loadIssues() , и это действие будет поймано в результате, который приведет к загрузке проблем, но этот эффект присутствует в функции проблемы. Поскольку проблемы могут быть загружены практически из всех функций, мой эффект loadIssues (расположенный в папке issue feature ) должен будет прослушивать fromDashboard.loadIssues , fromProject.loadIssues и fromBoard.loadIssues .Это выглядит странно, потому что я не чувствую, что функция проблемы должна знать о панели управления / проекте / плате.

Другим способом было бы сохранить его на корневом уровне, например:

 {
  "entities": {
    "projectEntities": {
      // ...
    },
    "boardEntities": {
      // ...
    },
    "issueEntities": {
      // ...
    }
  },
  "board": {
    // ...
  },
  "projects": {
    // ...
  },
  "issues": {
    // ...
  }
}
 

Где в модуле будут расположены объекты, действия и редукторы core . Редукторам и эффектам все равно придется прослушивать несколько действий (например, fromDashboard.loadIssues, fromProject.loadIssues и fromBoard.loadIssues), но для меня здесь все в порядке, если ядро знает обо всех функциях (в конце концов, это ядро приложения).

Но это как-то не кажется правильным, или, по крайней мере, для меня это не похоже на стандартный способ ngrx сделать это, но я могу ошибаться.

Спасибо за любую помощь.

Комментарии:

1. Привет! Я также думаю, что корневой уровень был бы лучшим выбором. Hovewer как вы в конечном итоге решили проблему?

Ответ №1:

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

Я написал небольшую статью на эту тему в разделе Обмен данными между модулями — это арахис.