4

我试图了解我们何时必须取消引用游标以获取其值。

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 代码中,处理程序(onclick、onchange...)使用光标而不取消引用它:

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

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

谢谢你。

4

1 回答 1

0

请注意,deleteandcomm不是游标,而是 core.async 通道。该操作将消息添加到此处put!处理的通道。

游标是一种包装状态的方式(在 om 中称为 app-state)。对于该状态,您可能需要做两件事:

  1. 改变状态:当你想改变你的应用状态时,你调用om/transact!om/update!一个光标到应用状态(从不需要deref)。Om 安排此事务在下一个渲染阶段显示。
  2. 读取状态:在渲染阶段读取时(在renderandrender-state函数中,游标像它的值一样工作,即,您不需要取消引用它。在任何其他时间点,游标可能正在处理或已计划事务,因此您希望取消引用它以获取当前值而不是某些不一致的状态。
于 2015-08-12T11:08:58.670 回答