我试图理解 Om Next 中的规范化、标识和查询概念。每次我认为我拥有它时,我都会遇到一个似乎让我感到困惑的新情况。
我有一个返回以下数据的遥控器:
{:users [
{:id 1,
:email "foo@example.com",
:role 1},
{:id 3,
:email "bar@floyhamilton.nl",
:role 1},
{:id 4,
:email "baz@example.com",
:role 1},
{:id 6,
:email "nom@example.com",
: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 "foo@example.com",
:role 1},
3
{:id 3,
:email "bar@floyhamilton.nl",
:role 1},
4
{:id 4,
:email "baz@example.com",
:role 1},
6
{:id 6,
:email "nom@example.com",
:role 1}},
:role/by-id {1 {:id 1, :name "admin"}}}
现在,关于我的问题。我想访问组件内的用户角色名称。我可以简单地(get-in @app-state [:role/by-id role :name])
在 User 组件的渲染函数中做一些事情,但这似乎不是惯用的事情。
关于“用链接思考”的 Om Next 文档 似乎提到了我的解决方案:idents。我尝试在用户查询(如[:id :email [:role/by-id 1]]
)中使用它并且有效!但是,我似乎无法将实际的角色 ID 插入到身份中!我用查询参数尝试了非常复杂的事情,像这样将它插入到缩进中,但这一切似乎都是做作的。
这似乎是一个非常普遍的情况,应该存在一个体面的解决方案,但我似乎无法理解!
*EDIT 添加了 Root 组件