我看过使用 Om 进行富客户端网站设计。这也是我第一次使用 core.async。阅读教程https://github.com/swannodette/om/wiki/Basic-Tutorial我已经看到使用 core.async 通道来处理删除操作(而不是在处理程序中完成所有工作)。我的印象是使用该通道进行删除只是因为删除回调是在一个范围内声明的,在该范围内,您在项目级别上有一个光标,您实际上想要操作包含该项目的列表。
为了更深入地了解通道,我看到了 Rich Hickey 的演讲http://www.infoq.com/presentations/clojure-core-async,他解释了使用通道从事件回调中获取应用程序逻辑是一个好主意。这让我想知道教程中删除通道的实际目的是否是为了展示构建应用程序的方式。如果是这样的话,
与该模式相关的最佳实践是什么?
是否应该为各种事件创建单独的频道?即,如果我添加一个控制器来创建一个新事件,我是否还会为对象创建创建一个新通道,然后用于将对象添加到应用程序中另一个位置的全局状态?
假设我有一个项目列表,其中一个项目有一个详细/简洁的状态标志。如果
detailed?
是true
,它将显示更多信息,如果detailed?
是false
,它将显示更少信息。我已经关联了一个在光标上使用的单击事件om/transact!
(作为全局状态对象中列表项的视图)。
(let [toggle-detail-handler
(fn [e]
(om/transact! (get-in myitem [:state])
#(conj % {:detailed? (not (:detailed? %))})))]
(html [:li {:on-click toggle-detail-handler}
"..." ]))
我意识到这可能是一个非常简洁的片段,其中使用通道作为将回调事件与实际逻辑更改分离的手段的整体好处起初似乎不值得付出努力,但更复杂示例的整体好处超过了这一点。但另一方面,为这种不详细的切换引入额外的通道似乎也给源代码增加了相当多的负载。
如果您能就整个设计问题提供一些提示/提示或其他想法并将它们放在透视图中,那就太好了。我在那里感到有些失落。