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}]])))
Другие вопросы по тегам