jQuery每个循环使用jayq和ClojureScript

时间:2014-04-10 17:54:09

标签: jquery clojurescript

我正在尝试使用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")返回的内容(完全不是数组)。

1 个答案:

答案 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中的函数类似:索引和当前迭代的元素。