我正在尝试使用 jayq 对 ClojureScript 中的某些元素执行each 循环,但没有取得任何成功。我在运行时不断收到“Invalid 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")
返回的第一个框,但随后收到“Invalid arity”错误。
我猜测,由于 jayq 没有 each
,因此可能有一种惯用的方法来执行此操作,但我无法找到它。我无法使用 map
因为 ($ "td.checkbox-col input")
返回(确切地说不是一个数组)。
最佳答案
我创建了一个通用解决方案。不确定它是否是最好的,但它完成了工作:
类似于 .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)))))
each 函数就像我们在 jQuery 中的函数一样:一个索引和当前迭代的元素。
关于jQuery 每个循环与 jayq 和 ClojureScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995502/