重新框架:输入:改变重置!不会改变输入值

时间:2015-06-29 04:08:51

标签: clojurescript reagent 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 个答案:

答案 0 :(得分:4)

Daniel Kersten在ClojureScript Google网上论坛上向我解释了为什么代码片段无效。该帖子的链接是here

第一个代码段

reagent会使用它自己的实现覆盖clojure的原子。 re-frame views.cljs默认情况下不会引用此信息。在您引用reagent的{​​{1}}版本后,事情就会奏效。

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]])) 需要一个功能。我正在:on-change街区过来。只需将do块包装在函数内即可修复错误。请参阅下面的正确代码:

do