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
Любая помощь ценится всеми!
1 ответ
Дэниел Керстен (Daniel Kersten) из группы Google ClojureScript объяснил мне, почему фрагменты кода не работают. Ссылка на пост здесь.
1-й фрагмент кода
reagent
Переопределение clojure
Атом с собственной реализацией. re-frame
"s views.cljs
не относится к этому по умолчанию. Как только вы обратитесь к reagent
версия atom
все будет работать.
На вершине views.cljs
файл, измените это:
(ns performance-tracker.views
(:require [re-frame.core :refer [subscribe dispatch]]))
чтобы:
(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}]])))