Скажем, у меня есть TodoStore. TodoStore отвечает за хранение моих предметов TODO. Элементы Todo хранятся в базе данных.
Я хочу знать, каков рекомендуемый способ загрузки всех элементов todo в магазин и как представления должны взаимодействовать с магазином для загрузки элементов TODO при запуске.
Первая альтернатива - создать действие loadTodos
, которое будет извлекать Todos из базы данных и генерировать событие TODOS_LOADED
. Затем представления будут вызывать действие loadTodos
, а затем прослушивать событие TODOS_LOADED
и затем обновляться, вызывая TodoStore.getTodos()
.
Другой альтернативой является отсутствие действия loadTodos
и наличие TodoStore.getTodos()
, которое будет возвращать обещание с существующими элементами TODO. Если TodoStore уже загрузил элементы TODO, он просто возвращает их; если нет, то он запросит из базы данных и вернет извлеченные элементы. В этом случае, даже если хранилище уже загрузило элементы TODO, оно не будет генерировать событие TODOS_LOADED, поскольку getTodos
не является действием.
function getTodos() {
if (loaded)
return Promise.resolve($todoItems);
else
return fetchTodoItemsFromDatabase().then(todoItems) {
loaded = true;
$todoItems = todoItems;
return $todoItems;
});
}
Я уверен, что многие скажут, что это нарушает архитектуру Flux, потому что функция getTodos
изменяет состояние хранилища, и состояние хранилища следует изменять только с помощью действий, отправленных диспетчером.
Однако, если вы считаете, что состояние для TodoStore - это существующие элементы TODO в базе данных, то getTodos
на самом деле не меняет никакого состояния. Элементы TODO точно такие же, поэтому нет необходимости обновлять или уведомлять представление. Единственное, что теперь хранилище уже извлекло данные, поэтому они теперь кэшируются в хранилище. С точки зрения View, его не должно волновать, как реализован Магазин. Это не должно заботить, нужно ли магазину получать данные из базы данных или нет. Все представления заботятся о том, чтобы они могли использовать Магазин для получения элементов TODO и что Магазин будет уведомлять их, когда новые элементы TODO создаются, удаляются или изменяются.
Следовательно, в этом сценарии представления должны просто вызывать TodoStore.getTodos() для визуализации себя при загрузке и регистрировать обработчик событий в TODO_CHANGE, чтобы получать уведомления, когда им необходимо обновить себя из-за добавления, удаления или изменения.
Что вы думаете об этих двух решениях. Это какие-то другие решения?