我正在尝试使用jayq对ClojureScript中的某些元素进行每个循环,但是我没有取得任何成功。我一直在运行时获得“无效的arity:1”。
该功能是根据单个框的选中值检查一堆框(想想“全部检查”功能)。 toggle-all-checkboxes
函数在单击“全部选中”框时调用:
(ns foo.events
(:use [jayq.core :only
[$ is prop]]))
(defn toggle-all-checkboxes [event]
(let [checked (is ($ (.-target event)) ":checked")]
(.each ($ "td.checkbox-col input")
(fn [_ checkbox] (
(prop ($ checkbox) "checked" checked))))))
这实际上会检查($ "td.checkbox-col input")
返回的第一个框,但之后会出现“无效的arity”错误。
我猜是因为jayq没有each
,所以可能有一种惯用的方法,但是我找不到它。我无法使用map
,因为($ "td.checkbox-col input")
返回的内容(完全不是数组)。
答案 0 :(得分:2)
我创建了一个通用解决方案。不确定它是否是最好的,但它完成了工作:
与.each in jQuery类似的通用功能:
(defn jq-each [selector each-fn]
(let [elements (js->clj ($ selector))]
(dotimes [el-num (count elements)]
(each-fn el-num (nth elements el-num)))))
我的用法示例:
(defn toggle-all-checkboxes [event]
(let [checked (is ($ (.-target event)) ":checked")]
(jq-each
"td.checkbox-col input"
(fn [i checkbox]
(prop ($ checkbox) "checked" checked)))))
每个函数都与我们在jQuery中的函数类似:索引和当前迭代的元素。