Clojure 获取错误未捕获错误:断言失败:反应为只读;不允许在现场进行
我不熟悉clojure和Agent。我试图生成动态数量的复选框,其状态存储在app state中,app state是这样一个dict列表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
[{: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])
...