我试图了解何时必须对游标进行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]))}))
那么,正确的方法是什么?
谢谢。
答案 0 :(得分:0)
请注意,delete
和comm
不是游标,而是core.async频道。 put!
操作会向处理here的频道添加一条消息。
游标是一种包装状态的方式(在om中称为app-state)。你可能想对这个状态做两件事:
om/transact!
或om/update!
到应用状态(从不需要deref)。 Om计划在下一个渲染阶段显示此事务。render
和render-state
函数内部)进行读取时,光标的工作方式与其值相同,即您不需要对其进行解析。在任何其他时间点,光标可能正在进行交易或具有计划事务,因此您需要对其进行deref以获取当前值而不是某些不一致状态。