Getting error Uncaught Error: Assert failed: Reaction is read only; on-set is not allowed
Getting error Uncaught Error: Assert failed: Reaction is read only; on-set is not allowed
我是 clojure 和试剂的新手。我试图生成动态数量的复选框,其状态存储在应用程序状态中,这是一个像这样的字典列表
[{:checked false, :text "Sample text 1"} {:checked false, :text "Sample text 2"} {:checked false, :text "Sample text 3"}]
下面的函数预计会生成一个复选框,该复选框对应于应用程序数据库 (db
) 的指定索引。该功能完成它的工作并且复选框是可点击的。
(defn gen-checkbox [index db]
[re-com/checkbox
:label (:text (@db index))
:model (:checked (@db index))
:on-change #(swap! db assoc-in [index :checked] (not(:checked (@db index))))
])
但是,当我单击任何复选框时,浏览器控制台中出现此错误。
Uncaught Error: Assert failed: Reaction is read only; on-set is not allowed
错误发生在swap!
。有人可以指出我做错了什么吗?
数据库初始化部分如下:
(re-frame/reg-event-db ::initialize-db
(fn [_ _]
(atom [{:checked false :text "Sample text"}, {:checked false :text "Sample text"}, {:checked false :text "Sample text"}])
))
我还有一个检索数据库的功能。我目前正在
(re-frame/reg-sub ::getdb
(fn [db]
@db
))
根据你问题的标签,我推测你使用的是re-frame
你can't update the database in re-frame directly。相反,您应该注册一个更新数据库的事件处理程序,如下所示(确切的代码取决于您的数据库的结构):
;; (require '[re-frame.core :as rf])
(rf/reg-event-db
:toggle-checkbox
(fn [db [_ index]]
(update-in db [index :checked] not)))
然后在复选框渲染器的代码中发送事件:
...
:on-change #(rf/dispatch [:toggle-checkbox index])
...
我是 clojure 和试剂的新手。我试图生成动态数量的复选框,其状态存储在应用程序状态中,这是一个像这样的字典列表
[{:checked false, :text "Sample text 1"} {:checked false, :text "Sample text 2"} {:checked false, :text "Sample text 3"}]
下面的函数预计会生成一个复选框,该复选框对应于应用程序数据库 (db
) 的指定索引。该功能完成它的工作并且复选框是可点击的。
(defn gen-checkbox [index db]
[re-com/checkbox
:label (:text (@db index))
:model (:checked (@db index))
:on-change #(swap! db assoc-in [index :checked] (not(:checked (@db index))))
])
但是,当我单击任何复选框时,浏览器控制台中出现此错误。
Uncaught Error: Assert failed: Reaction is read only; on-set is not allowed
错误发生在swap!
。有人可以指出我做错了什么吗?
数据库初始化部分如下:
(re-frame/reg-event-db ::initialize-db
(fn [_ _]
(atom [{:checked false :text "Sample text"}, {:checked false :text "Sample text"}, {:checked false :text "Sample text"}])
))
我还有一个检索数据库的功能。我目前正在
(re-frame/reg-sub ::getdb
(fn [db]
@db
))
根据你问题的标签,我推测你使用的是re-frame
你can't update the database in re-frame directly。相反,您应该注册一个更新数据库的事件处理程序,如下所示(确切的代码取决于您的数据库的结构):
;; (require '[re-frame.core :as rf])
(rf/reg-event-db
:toggle-checkbox
(fn [db [_ index]]
(update-in db [index :checked] not)))
然后在复选框渲染器的代码中发送事件:
...
:on-change #(rf/dispatch [:toggle-checkbox index])
...