2017-08-30 38 views
1

我想了解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插入到标识中!我已经用查询参数尝试过非常复杂的事情,将它插入到缩进中,但它似乎都非常可怕。

这似乎是一个难以置信的普遍情况,一个体面的解决方案应该存在,但我似乎无法得到它!

*编辑添加的根组件

回答

1

User你的查询语法应该是这样的:

[:id :email {:user-role (om/get-query Role)}] 

然后为用户表状态可能是:

{:id 6, 
:email "[email protected]", 
:user-role [:role/by-id 1]} 

如果您在问题中显示defui,这将有所帮助,特别是对于Root。 Om.Next的一点是,所有连接都必须在Root组件上完成,以便使应用程序状态正确归一化。

+0

':user-role'是'连接'或'边缘'。随着你的进展,你只需要加入这些连接。你在看REPL的状态吗? –

+0

您是否回答假设后端处理用户查询?因为这是一个相当愚蠢的REST API,它将按原样返回用户列表。我在REPL以及我的浏览器中沿着这两个方向走。 – Linus

+0

我假设整个事情都在客户端。因此,客户端状态和客户端组件,不管怎样都不会调用服务器。 –