Clojure 获取错误未捕获错误:断言失败:反应为只读;不允许在现场进行

Clojure 获取错误未捕获错误:断言失败:反应为只读;不允许在现场进行,clojure,single-page-application,clojurescript,reagent,re-frame,Clojure,Single Page Application,Clojurescript,Reagent,Re Frame,我不熟悉clojure和Agent。我试图生成动态数量的复选框,其状态存储在app state中,app state是这样一个dict列表 [{:checked false,:text“示例文本1”}{:checked false,:text“示例文本2”}{:checked false,:text“示例文本3”}] 下面的函数将生成一个对应于应用程序数据库指定索引(db)的复选框。该函数执行它的任务,并且复选框可单击 (defn gen-checkbox [index db] [r

我不熟悉clojure和Agent。我试图生成动态数量的复选框,其状态存储在app state中,app state是这样一个dict列表

[{:checked false,:text“示例文本1”}{:checked false,:text“示例文本2”}{:checked false,: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

你。相反,您应该注册一个更新数据库的事件处理程序,如下所示(确切的代码取决于数据库的结构):

然后在复选框渲染器的代码中分派事件:

...
:on-change #(rf/dispatch [:toggle-checkbox index])
...

您是否在
:on change
匿名函数周围有一组额外的括号?@exupero这是一个输入错误。我已经改正了。但是,错误仍然是一样的。您能否显示处理您的
db
的代码部分?你如何储存它?谢谢Aleph:)。但是,我现在遇到了一个新错误:没有为cljs.core/PersistentVector类型定义协议方法IDeref.-deref:[{:选中false,:text“Sample text”}{:选中false,:text“Sample text”}{:选中true,:text“Sample text”}]我已经用您建议的初始化db的部分代码更新了该代码段。您应该确保没有两次取消对db订阅的引用。如果
gen checkbox
db
参数已包含取消引用的订阅,则不应在函数体中添加
@
:标签(:文本(获取db索引)):型号(:选中(获取db索引))
...
:on-change #(rf/dispatch [:toggle-checkbox index])
...