我需要将字符串转换为某种形式的哈希.这在JavaScript中可行吗?
我没有使用服务器端语言,所以我不能这样做.
说我有一个TodoStore.TodoStore负责保存我的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;
});
}
Run Code Online (Sandbox Code Playgroud)
我相信很多人会说这会打破Flux体系结构,因为getTodos函数正在改变存储状态,只有通过调度程序发送的操作才能更改存储状态.
但是,如果您认为TodoStore的状态是数据库中现有的TODO项,那么getTodos实际上并没有改变任何状态.TODO项目完全相同,因此不需要更新或通知视图.唯一的事情是,现在商店已经检索了数据,因此它现在缓存在商店中.从View的角度来看,它不应该真正关心Store的实现方式.如果商店仍然需要从数据库中检索数据,它应该不在乎.所有关注的视图都是他们可以使用Store来获取TODO项目,并且Store会在创建,删除或更改新TODO项目时通知他们.
因此,在这种情况下,视图应该只调用TodoStore.getTodos()在加载时呈现自己,并在TODO_CHANGE上注册事件处理程序,以便在需要由于添加,删除或更改而自行更新时得到通知.
您如何看待这两种解决方案?他们还有其他解决方案吗?