Я посмотрел, как использовать Om для богатого дизайна веб-сайта клиента. Это также мой первый раз, используя core.async. Чтение учебника https://github.com/swannodette/om/wiki/Basic-Tutorial Я видел использование канала core.async для обработки операции удаления (в отличие от выполнения всей работы в обработчике). У меня создалось впечатление, что использование этого канала для удаления было просто сделано, потому что обратный вызов delete был объявлен в области, где у вас есть указатель на уровне элемента, где вы действительно хотите манипулировать списком, содержащим этот элемент.
Чтобы получить больше информации о каналах, я видел, как Rich Hickey говорил http://www.infoq.com/presentations/clojure-core-async, где он объясняет, как неплохо использовать каналы для получения логики приложения вне события -callbacks. Это заставило меня задуматься, действительно ли цель канала удаления в учебнике заключалась в том, чтобы показать этот способ структурирования приложения. Если да,
-
Каковы наилучшие методы, связанные с этим шаблоном?
-
Следует ли создавать отдельные каналы для всех видов событий? То есть Если я добавлю контроллер для создания нового события, могу ли я создать новый канал для создания объектов, который затем используется для того, чтобы объекты добавлялись в глобальное состояние в другом месте приложения?
-
Допустим, у меня есть список элементов, и у одного элемента есть подробный/сжатый флаг состояния. Если
detailed?
-true
, он отобразит больше информации, еслиdetailed?
-false
, будет отображаться меньше информации. Я связал событие on-click, которое использует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}
"..." ]))
Я понимаю, что это может быть очень сжатый фрагмент, в котором общая польза использования каналов как средства отделить событие обратного вызова от изменений логической логики вначале не стоит усилий, но общие преимущества с более сложными примерами перевешивают это. Но, с другой стороны, введение дополнительного канала для такого подробного, но не подробного переключения, похоже, добавляет достаточную нагрузку на исходный код.
Было бы здорово, если бы вы могли дать некоторые подсказки/советы или другие мысли по всей проблеме дизайна и поместить их в перспективу. Я чувствую себя немного потерянным там.