我想了解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
我假設整個事情都在客戶端。因此,客戶端狀態和客戶端組件,不管怎樣都不會調用服務器。 –