wir*_*bel 20 clojurescript core.async om
我已经看过使用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}
"..." ]))
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是一个非常简洁的代码片段,其中使用渠道为手段,以分离从acutal逻辑变化的回调事件的整体利益呢起初似乎不值得,但更复杂的例子总体效益大于这个.但另一方面,为这种细节引入额外的通道 - 不详细的切换似乎也为源代码增加了相当大的负载.
如果你能对整个设计问题给出一些提示/提示或其他想法并将它们放到透视中,那就太好了.我觉得那里有点失落.
小智 16
我使用通道在无法通过游标进行通信的组件之间进行通信.
例如,我在以下情况下使用频道:
:state来完成om/build)请注意,我喜欢将"域状态"保留在app state atom中,并将GUI状态保持在组件本地状态.也就是说,app状态是正在呈现的内容,而本地状态是如何呈现的.(其中"how"也指哪个部分)例如,如果您正在编写文本编辑器,则app状态是正在编辑的文档,本地状态是正在编辑的页面,是否选择了粗体.
一般来说,我使用单个通信通道,我放置[topic value]对.然后我使用pub和sub来路由消息.例如,(def p (async/pub ch first))用主题来分派的事件并(om/sub p my-ch :foo)与主题接收消息:foo来my-ch.我通常将此单个通信通道存储在Om的共享状态中.
有时我会使用多个渠道,但我会这样做来设置特定的管道或工作流程,而不是用于通用消息传递.例如,如果我有一个处理组件的管道来处理数据流,那么我可能将其设置为一个通道链,其端点连接到我的Om应用程序.对于一般的UI开发,这种情况很少见.我也在为我的Om组件使用Qt-esque信号/插槽系统,我还在尝试使用共享信号通道,而每个信号都是自己的通道.我尚未决定哪种方法更好.
| 归档时间: |
|
| 查看次数: |
2460 次 |
| 最近记录: |