我从这里复制了一份两年前的要点.它现在正在使用Figwheel并使用更新版本的Reagent/React.我正在寻找一种隔离来自Javascript控制台的警告消息的通用方法:Warning: Every element in a seq should have a unique :key.我们的想法是在:key所有组件中添加一个生成的唯一值.然后消息应该消失,我将能够看到哪些组件需要唯一的:key.我的问题是,尽管:key所有这些都被放入了一个唯一的,但仍然可以看到警告信息.
所以 - 有人能够告诉我我错过了哪个组件或者我做错了什么?正如可以从看到源(永久)我已经添加:key (gen-key)到这两种组分:[:polyline {:key (gen-key) ...和[:svg {:key (gen-key) ...分别在线43和68.
编辑所以这就是答案(永久链接),无论如何都是代码.只需查看第^{:key (gen-key)}44和60行的位置.
请注意,该功能gen-key是为调试而设计的.自然键要更换.
这是您可以实现的方式gen-key:
(defn gen-key []
(gensym "key-"))
Run Code Online (Sandbox Code Playgroud)
这是在上面的链接中完成的方式:
(def uniqkey (atom 0))
(defn gen-key []
(let [res (swap! uniqkey inc)]
(u/log res)
res))
Run Code Online (Sandbox Code Playgroud) 我安装了boot-clj并希望能够在外部编辑器中编辑.clj文件,并且单独运行命令行REPL,我可以从中调用我在.clj文件中更改的函数.不需要特殊的重新加载命令.
另一件事是我不想手动输入命令来包含命名空间 - 我想只运行一个脚本将我带入命名空间,所以我可以立即调用现有的函数.
文件名:
C:\dev\my-project\src\my_project\utils.clj
Run Code Online (Sandbox Code Playgroud)
文件内部的东西:
(ns my-project.utils
(:require
[clojure.string :as s]))
(defn my-range [start end]
(take (- end start) (iterate inc start)))
Run Code Online (Sandbox Code Playgroud)
我想直接进入REPL (my-range 0 3),看看它是否产生了我想要的结果.
这是什么设置?我需要运行的脚本文件是什么样的?
我目前的理解是答案看起来像这样:
(deftask dev-repl
(set-env! …)
(repl))
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解 Web Development With Clojure 书中的这段代码。它关于 clojure 脚本:
(defn message-form []
(let [fields (atom {})]
(fn []
[:div.content
[:div.form-group
[:p "Name:"
[:input.form-control
{:type :text
:name :name
:on-change #(swap! fields assoc :name (-> % .-target .-value))
:value (:name @fields)}]]]
[:p "Message:"
[:textarea.form-control
{:rows 4
:cols 50
:name :message
:on-change #(swap! fields assoc :message (-> % .-target .-value))}
(:message @fields)]]
[:input.btn.btn-primary {:type :submit :value "comment"}]])))
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这部分:
#(swap! fields assoc :name (-> % .-target .-value)
Run Code Online (Sandbox Code Playgroud)
尤其是这个: ...(-> % .-target .-value)
我在一个名称空间中有这个函数,它不导入/要求/使用任何其他包:
(defn crash [msg]
(throw (Throwable. msg)))
Run Code Online (Sandbox Code Playgroud)
Cursive(IntelliJ IDEA IDE插件)突出显示Throwable并给我留言Cannot disambiguate overloads of Throwable.我用Exception和获得相同的消息Error.
我不明白这条消息的来源 - 我怀疑这些Java类是在除Java语言之外的任何其他jar文件中定义的.我可以做些什么来消除这个消息?
这些是project.clj:
:dependencies [[org.clojure/clojure "1.6.0"]
[net.mikera/imagez "0.8.0"]
[org.clojure/math.numeric-tower "0.0.4"]]
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用https://github.com/ptaoussanis/timbre登录到文件而不是控制台。这是我找到的一些有关如何执行此操作的文档:
; The default setup is simple console logging. We with to turn off console logging and
; turn on file logging to our chosen filename.
(timbre/set-config! [:appenders :standard-out :enabled?] false)
(timbre/set-config! [:appenders :spit :enabled?] true)
(timbre/set-config! [:shared-appender-config :spit-filename] log-file-name)
(timbre/set-config! [:shared-appender-config :spit-filename] log-file-name)
Run Code Online (Sandbox Code Playgroud)
这适用于先前版本的 sente,但不适用于版本 [com.taoensso/timbre "4.3.1"]。(由于无关的原因,我需要使用最新的)。上面代码的问题是set-config!现在需要一个参数 - 一个哈希映射。而且我找不到任何文档可以帮助我将上述“两个参数”代码转换为新的“一个参数”代码。
我知道有一个非常类似的问题了那里。这个问题有实际的代码,所以更具体。我也提出了一个问题。上面的代码基本上直接来自here。
我正在用 clojure 编写一个带有 Hiccup(和其他东西)的网络服务器应用程序。我正在尝试使用一个小 JS 启用和禁用两个下拉字段的复选框,但我无法使其工作。
[:head
[:script "function toggleText(cb, t1, t2) {
document.getElementById(t1).disabled = !cb.checked;
document.getElementById(t2).disabled = !cb.checked;
}"]]
[:td (hf/check-box {:on-change (str "toggleText(" (name endtag) "," (name tytag) "," (name tmtag) ")")} endtag)]
[:td (hf/drop-down tytag (range 2013 2031) 2017)]
[:td (hf/drop-down tmtag (range 1 13) 6)]
Run Code Online (Sandbox Code Playgroud) 人们说避免使用map顺序执行副作用,这是有道理的.
但在现实世界中,我发现自己需要保留结果并map急切地评估,即插入数据库并返回记录时.
这是(doall (map ..))我唯一的选择吗?有没有比较惯用的方法呢?
我使用a Page.scala来启动Scala.js应用程序的客户端.因此Page.scala取代了index.html.Scalatags raw函数允许包含实际的JavaScript.在Scalatags文档中,示例是alert('Hello!').我实际上有一些JavaScript可以解决浏览器的问题,但是说"你好!" 一开始就好.JavaScript本身就是这里的get_browser_info()功能.
所以我的问题是,我可以在Scala代码中调用这一点JavaScript吗?这是一种明智的方式来发现用户正在使用的浏览器吗?我想将此信息发送回服务器.
当然我可以将函数转换为Scala,但是检查浏览器的JavaScript并不容易让我阅读 - 我从来都不是一个JavaScript程序员.
翻译会很棒,即使它几乎只能回答核心问题.
编辑@sjrd给出了启动Scala代码的答案.为了给出完整的图片,这就是Page.scala的样子:
object Page{
val boot =
"simple.MyScalaClient().main(document.getElementById('contents'))"
val browserVersionFn = "<script>function get_browser_info(){var ua=navigator.userAgent ... version: M[1]};}</script>"
val skeleton =
html(
head(
meta(charset:="utf-8"),
script(src:= "/myappname/myappname-fastopt.js"),
link(
rel:="stylesheet",
href:="http://yui.yahooapis.com/pure/0.5.0/pure-min.css"
)
),
body(
style := "margin:30",
onload := boot,
div(id:="contents"),
raw(browserVersionFn)
)
)
}
Run Code Online (Sandbox Code Playgroud) 在Clojure中,如何打印矢量的内容?(我想到了控制台,通常用于调试目的).如果答案可以推广到任何好的Seq.
编辑: 我应该补充一点,它应该是一个简单的函数,它提供看起来合理的输出,因此每行打印一个项目 - 因此可以很容易地用于调试目的.我确信有些库可以做到这一点,但使用库确实看起来有点过分.
我的开发卡曾经与 Figwheel 一起使用。但是我无法让它们用 shadow-cljs 显示。
阴影发出此消息:
shadow-cljs - 用于 :cards 的 HTTP 服务器,可在http://localhost:3450
命名空间cards.card-ui只是一系列的需求。
我有一条println消息cards.card-ui正在显示。
在shadow-cljs.edn我有两个:builds. 这是第二个:
:cards {:target :browser
:output-dir "resources/public/js/cards"
:asset-path "js/cards"
:modules {:main {:entries [cards.card-ui]}}
:compiler-options {:static-fns false}
:devtools {:http-root "resources/public"
:http-resource-root "resources/public"
:http-port 3450
:http-handler shadow.http.push-state/handle
:push-state/index "cards.html"
:preloads [devtools.preload
default-db-format.preload]}
:dev {:compiler-options {:devcards true}}
}
Run Code Online (Sandbox Code Playgroud)
cards.html有一个body标签,它有一个id为“app”的div标签。我将浏览器带到http://localhost:3450/cards.html并得到一个空白页面。我最好的理论是cards.card-ui命名空间没有安装在app.