re-frame: ввод: сброс при изменении! не изменяет входное значение

Я играю с фреймворком re-frame.


В приведенном ниже коде у меня возникают проблемы с обновлением входного значения, когда пользователь что-то вводит:

(defn measurement-input [{:keys [amount unit path]}]
  (let [amt (atom amount)]
    (fn []
      [:div
       [:input {:type "text"
                :value @amt
                :on-change #(reset! amt (-> % .-target .-value))}]
       [:input {:type "button"
                :value unit}]])))

Входное значение не изменится до тех пор, пока я не изменю :value на :defaultValue. Я почти уверен, что приведенный выше пример очень похож на пример ввода Reagent.


В приведенном ниже коде я пытаюсь сделать две вещи, когда пользователь обновляет входное значение. Я пытаюсь reset! ввести значение, а также dispatch значение для обработчика событий. Я заключил оба этих вызова функций в вызов do.

Также следует отметить, что в приведенном ниже коде пользователь может обновить значение в текстовом поле.

(defn measurement-input [{:keys [amount unit path]}]
  (let [amt (atom amount)]
    (fn []
      [:div
       [:input {:type "text"
                :value @amt
                :on-change (do #(reset! amt (-> % .-target .-value))
                                (re-frame/dispatch [:update-value @amt]))}]
       [:input {:type "button"
                :value unit}]])))

В консоли javascript я получаю следующую ошибку:

Uncaught TypeError: Cannot read property 'call' of null  template.cljs?rel=1435381284083:101 

Любая помощь приветствуется всеми!


person Kurt Mueller    schedule 29.06.2015    source источник


Ответы (1)


Дэниел Керстен из Google Groups ClojureScript объяснил мне, почему фрагменты кода не работают. Ссылка на сообщение находится здесь.


1-й фрагмент кода

reagent переопределяет атом clojure собственной реализацией. views.cljs re-frame не относится к этому по умолчанию. Как только вы обратитесь к версии atom reagent, все заработает.

В верхней части файла views.cljs измените это:

(ns performance-tracker.views
    (:require [re-frame.core :refer [subscribe dispatch]]))

to:

(ns performance-tracker.views
    (:require [reagent.core  :as reagent :refer [atom]]
              [re-frame.core :refer [subscribe dispatch]]))

2-й фрагмент кода

:on-change ожидает функцию. Я проезжал в блоке do. Простое обертывание блока do внутри функции исправило ошибку. Ниже приведен правильный код:

(defn measurement-input [{:keys [amount unit path]}]
  (let [amt (atom amount)]
    (fn []
      [:div
       [:input {:type "text"
                :value @amt
                :on-change #(do (reset! amt (-> % .-target .-value)) ;; argument literal, %, is the event passed in the function callback
                            (re-frame/dispatch [:update-value @amt [:measurements path :amount]]))}]
       [:input {:type "button"
                :value unit}]])))
person Kurt Mueller    schedule 30.06.2015