4

jquery.ui.sortable で jayq を使用して、ページ上のリストをソート可能にしようとしています。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

これを解決するには、2 つの異なる側面がありました。

  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 の後、生成された ClojureScript の前に jquery-ui コードを含める必要があるため、これは機能しません。解決策は、ページにライブラリを手動で含めることです。

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