4

我正在尝试将 jayq 与 jquery.ui.sortable 一起使用以使页面上的列表可排序。查看http://jqueryui.com/demos/sortable/似乎应该很简单:

(.sortable ($ :#sortable))

编译为:

jayq.core.$.call(null, "\ufdd0'#sortable").sortable();

并抛出:

Uncaught TypeError: Cannot call method 'call' of undefined

当我尝试将其包含在页面中时。有趣的是,当我将生成的代码粘贴到 js 控制台时,它确实在页面中工作,这对我来说意味着在执行该行之后加载了一些必要的东西。

我已经修改

(def cljs-options {:advanced {:externs ["externs/jquery.js"]}})

(def cljs-options {:advanced {:externs ["externs/jquery.js" "js/ui/jquery-ui.js]}})

在阅读 http://lukevanderhart.com/2011/09/30/using-javascript-and-clojurescript.html之后 ,这似乎还不够。我猜 jquery.ui 修改了 $ Prototype,但我不确定如何在 clojurescript 中完成此操作

如果有什么不同的话,我也在使用 noir 和 noir-cljs。

考虑将 jQueryUI 与闭包编译器一起使用,可能只是 jquery-ui 需要一个手卷的externs 文件才能使用,这可能是一项重大任务。任何人都可以确认吗?

4

1 回答 1

6

解决这个问题有两个不同的方面。

  1. 要在高级模式下编译,我需要将以下内容添加到我的 externs 文件中。

    $.prototype.sortable = function (a,b) { };
    $.prototype.disableSelection = function (a,b) { };
    
  2. 我正在使用 noir-cljs,在我的视图模板中,有以下内容:

    (:require [noir.cljs.core :as cljs])
    (:use [hiccup.page :only [include-js]])
    ...
    (cljs/include-scripts :with-jquery)  
    (include-js "/js/jquery-ui.js")
    

但这永远行不通,因为 jquery-ui 代码需要包含在 jquery 之后但在生成的 ClojureScript 之前。解决方案是在页面中手动包含库:

(include-js "/js/jquery.js")
(include-js "/js/jquery-ui.js")
(include-js "/cljs/bootstrap.js") ;; Generated
于 2012-09-17T04:27:24.237 回答