OM: курсоры deref в обработчиках событий?

Я пытаюсь понять, когда мы должны отменить ссылку на курсор, чтобы получить его значение.

В вики о курсорах говорится, что обработчики событий не считаются частью фазы рендеринга, и поэтому курсоры в обработчиках должны дрефиться. То же самое показано в 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]))}))

Итак, каков правильный путь?

Спасибо.


person Asher    schedule 09.08.2015    source источник


Ответы (1)


Обратите внимание, что delete и comm — это не курсоры, а каналы core.async. Операция put! добавляет сообщение в канал, который обрабатывается здесь.

Курсоры — это способ обертывания состояния (называемого состоянием приложения в om). Есть две вещи, которые вы можете сделать с этим состоянием:

  1. Изменение состояния: когда вы хотите изменить свое состояние приложения, вы вызываете om/transact! или om/update! на одном из курсоров состояния приложения (deref никогда не требуется). Om планирует показать эту транзакцию на следующем этапе рендеринга.
  2. Прочитайте состояние: при чтении во время фазы рендеринга (внутри функций render и render-state курсор работает как его значение, т. е. вам не нужно разыгрывать его. В любой другой момент времени курсор может обрабатываться на или иметь запланированную транзакцию, поэтому вы хотите разобрать ее, чтобы получить текущее значение, а не какое-то несогласованное состояние.
person sbensu    schedule 12.08.2015