1

我试图理解 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 组件

4

1 回答 1

1

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

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

那么用户的表状态可能是:

{:id 6,
 :email "nom@example.com",
 :user-role [:role/by-id 1]}

如果您defui在问题中显示您的 s 会有所帮助,尤其是对于Root. Om.Next 的一件事是,所有连接都必须在Root组件上完成,才能使应用程序状态正确规范化。

于 2017-08-30T09:08:15.430 回答