OM:事件处理程序中的deref游标?

时间:2015-08-09 07:05:05

标签: cursor clojurescript om

我试图了解何时必须对游标进行deref以获取其值。

om cursors wiki中说明了这一点 事件处理程序被认为不是呈现阶段的一部分,因此应该处理处理程序中的游标。 同样显示在Basic-tutorial

(defn contact-view [contact owner]
  (reify
    om/IRenderState
    (render-state [this {:keys [delete]}]
      (dom/li nil
        (dom/span nil (display-name contact))
        (dom/button #js {:onClick (fn [e] (put! delete @contact))} "Delete")))))

但是,在TodoMVC code中,处理程序(onclick,onchange ...)使用游标而不去除它:

(dom/button
   #js {:className "destroy"
        :onClick (fn [_] (put! comm [:destroy todo]))}))

那么,正确的方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

请注意,deletecomm不是游标,而是core.async频道。 put!操作会向处理here的频道添加一条消息。

游标是一种包装状态的方式(在om中称为app-state)。你可能想对这个状态做两件事:

  1. 更改状态:当您想要更改应用状态时,在游标的一个上调用om/transact!om/update!到应用状态(从不需要deref)。 Om计划在下一个渲染阶段显示此事务。
  2. 读取状态:在渲染阶段(在renderrender-state函数内部)进行读取时,光标的工作方式与其值相同,即您不需要对其进行解析。在任何其他时间点,光标可能正在进行交易或具有计划事务,因此您需要对其进行deref以获取当前值而不是某些不一致状态。