我想了解Om Next中的规范化,标识和查询概念。每次我想我拥有它时,我都会陷入一种似乎困扰着我的新形势。在Om中解析外键Next
我有一个返回下列数据的远程:
{:users [
{:id 1,
:email "[email protected]",
:role 1},
{:id 3,
:email "[email protected]",
:role 1},
{:id 4,
:email "[email protected]",
:role 1},
{:id 6,
:email "[email protected]",
:role 1}}]
:roles [
{:id 1, :name "admin"}]}
我我的结构部件是这样的:
(defui Root
static om/IQuery
(query [this]
`[{:users ~(om/get-query User)}
{:roles ~(om/get-query Role)}]))
(defui Role
static om/Ident
(ident [this {:keys [id]}]
[:role/by-id id])
static om/IQuery
(query [this]
[:id :name]))
(defui User
static om/Ident
(ident [this {:keys [id]}]
[:user/by-id id])
static om/IQuery
(query [this]
[:id :email :role]))
这将导致调解归我的数据是这样的:
{:users
[[:user/by-id 1] [:user/by-id 3] [:user/by-id 4] [:user/by-id 6]],
:roles [[:role/by-id 1]],
:user/by-id
{1
{:id 1,
:email "[email protected]",
:role 1},
3
{:id 3,
:email "[email protected]",
:role 1},
4
{:id 4,
:email "[email protected]",
:role 1},
6
{:id 6,
:email "[email protected]",
:role 1}},
:role/by-id {1 {:id 1, :name "admin"}}}
现在,至于我的问题。我想在组件中访问用户的角色名称。我可以在用户组件的渲染函数中简单地执行诸如(get-in @app-state [:role/by-id role :name])
之类的操作,但这看起来不像是惯用的东西。
关于"Thinking with links"的Om Next文件似乎提到了我的解决方案:idents。我试图在用户查询中使用这个(如[:id :email [:role/by-id 1]]
),并且工作正常!但是,我似乎无法将实际的角色ID插入到标识中!我已经用查询参数尝试过非常复杂的事情,将它插入到缩进中,但它似乎都非常可怕。
这似乎是一个难以置信的普遍情况,一个体面的解决方案应该存在,但我似乎无法得到它!
*编辑添加的根组件
':user-role'是'连接'或'边缘'。随着你的进展,你只需要加入这些连接。你在看REPL的状态吗? –
您是否回答假设后端处理用户查询?因为这是一个相当愚蠢的REST API,它将按原样返回用户列表。我在REPL以及我的浏览器中沿着这两个方向走。 – Linus
我假设整个事情都在客户端。因此,客户端状态和客户端组件,不管怎样都不会调用服务器。 –