2017-08-30 43 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

我假設整個事情都在客戶端。因此,客戶端狀態和客戶端組件,不管怎樣都不會調用服務器。 –