除非从附带浏览器的REPL调用,否则Fn不会更新DOM

时间:2013-02-25 20:49:32

标签: dom clojurescript

我正在将一个TODO应用程序从vanilla JavaScript移植到ClojureScript中。到目前为止一切都那么好,除了这个看似无辜的功能:

;; loop the @todo-list, write each todo at the end of the <body>
(defn show-todos []
  (js/alert "in show-todos")
  (map
   #(appendChild (.-body js/document) (.createTextNode js/document (str %)))
   @todo-list))

执行另一个函数并调用show-todos,浏览器显示警告消息,但文档没有任何更新。但是,如果我打开另一个终端并启动浏览器附加的repl:

$ lein trampoline cljsbuild repl-listen
Running ClojureScript REPL, listening on port 9000.
"Type: " :cljs/quit " to quit"
ClojureScript:cljs.user> (in-ns 'todo-cljs.todos)
ClojureScript:todo-cljs.todos> (show-todos)
(#<[object Text]>)

这实际上是在屏幕上添加待办事项列表的内容。我正在使用lein-cljsbuild插件版本0.3.0。并且只有空白优化。

任何提示?

1 个答案:

答案 0 :(得分:1)

快速回答ClojureScript Google小组:

问题是地图是懒惰的,来自文档:

  

返回由应用...

的结果组成的延迟序列

使用repl强制对集合(@ todo-list)上的映射进行评估。建议修复:

  • 将来电从(map fn coll)更改为(doseq coll fn)
  • (doall (map... - 如果您想要地图的结果
  • (dorun (map... - 如果你不

就我而言,dorun完全没问题。