2015-06-29 6 views
5

Я играю с рамкой 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.


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

любая помощь всем!

ответ

3

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


первый фрагмент кода

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

В верхней части файла 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]])) 

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

:on-change ожидает функции. Я проходил в блоке . Просто обертывание блока 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}]])))