ClojureScript没有这样的命名空间

时间:2014-01-14 22:46:58

标签: clojure clojurescript

我是Clojure的新手,我正在尝试在我的项目中实现一些ClojureScript函数。我将[org.clojure/clojurescript "0.0-2138"]添加到project.clj中的依赖项中。我试过例如:

(js/alert "Hello from ClojureScript.")

它说No such namespace: js

我做错了什么?有人可以帮忙吗?

这是我的完整project.clj

(defproject MyProject "0.1.0-SNAPSHOT"
    :description "FIXME: write description"
    :url "http://example.com/FIXME"
    :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
    :dependencies [[org.clojure/clojure "1.5.1"][table "0.4.0"][cljs-uuid "0.0.4"][lein-swank "1.4.5"][midje "1.5.1"]
                 [mysql/mysql-connector-java "5.1.18"][org.clojure/java.jdbc "0.1.1"]
                 [ring/ring-jetty-adapter "1.1.6"]
                 [compojure "1.1.3"]
                 [hiccup "1.0.2"]
                 [org.clojure/clojurescript "0.0-2138"]
                 [domina "1.0.2"]
                 [prismatic/dommy "0.1.1"]]

     :plugins [[lein-cljsbuild "0.3.4"]]

      ;; cljsbuild options configuration
      :cljsbuild {:builds
              [{;; CLJS source code path
                :source-paths ["src/cljs"]

                ;; Google Closure (CLS) options configuration
                :compiler {;; CLS generated JS script filename
                           :output-to "resources/public/js/test.js"
                           ;; minimal JS optimization directive
                           :optimizations :whitespace
                           ;; generated JS code prettyfication
                           :pretty-print true}}]}
)

这是我试图放置ClojureScript函数的文件。我正在使用Eclipse和Clojure REPL。

(ns webapp.pages
    (:use [compojure.core :only (defroutes GET)]
        [ring.adapter.jetty :as ring])
     (:require [clojure.java.jdbc :as sql])
    (:require
        [ring.util.response :as resp])
    (:use [hiccup.page :only (html5 include-css include-js)])
    (:use webapp.db)
)

(defn showAlert []
    (js/alert "Hello from ClojureScript.")
)

(defn insert-user [firstname lastname email password sex date]
    (sql/with-connection db

      (sql/insert-values :users
                      [:name :lastName :email :password :birthDate :gender]
                      [firstname lastname email password date sex])

    )
    (resp/redirect "/")

    (showAlert)
)

(defn index []

    (html5
     [:head
        [:title "Kladionica"]
        [:meta {:name "viewport" :content "width=device-width, initial-scale=1"}]
        (include-css "/public/css/bootstrap.min.css")
        ]
     [:body
       [:div {:class "modal fade" :id "myModal" :role "dialog" :aria-hidden "true"}
        [:div {:class "modal-dialog"}
          [:div {:class "modal-content"}
                             [:div {:class "modal-header"}
                                   [:button {:type "button" :class "close" :data-dismiss "modal"}"x"]
                                   [:h3 "Registracija"]
                             ]
                             [:div {:class "modal-body"}
                                   [:form {:action "/insert-user" :method "post" :class "form" :role "form"}
                                          [:div {:class "row"}
                                                [:div {:class "col-xs-6 col-md-6"}
                                                      [:input {:class "form-control" :style "margin-bottom: 10px;" :name "firstname" :placeholder "Ime" :type "text"}]


                                                ]
                                                 [:div {:class "col-xs-6 col-md-6"}

                                                      [:input {:class "form-control" :style "margin-bottom: 10px;" :name "lastname" :placeholder "Prezime" :type "text"}]

                                                ]

                                          ]
                                          [:input {:class "form-control" :style "margin-bottom: 10px;" :name "email" :placeholder "Email" :type "email"}]
                                          [:input {:class "form-control" :style "margin-bottom: 10px;" :name "password" :placeholder "Lozinka" :type "password"}]
                                          [:input {:class "form-control" :style "margin-bottom: 10px;" :name "re-password" :placeholder "Ponovljena lozinka" :type "password"}]
                                          [:label {:for ""} "Datum rodjenja"]
                                          [:div {:class "row"}
                                                [:div {:class "col-xs-4 col-md-4"}
                                                      [:select {:class "form-control" :name "month"}
                                                               [:option {:value "" :disabled "disabled" :selected "selected"} "Mjesec"]
                                                               [:option {:value "01"} "Januar"]
                                                               [:option {:value "02"} "Februar"]
                                                               [:option {:value "03"} "Mart"]
                                                               [:option {:value "04"} "April"]
                                                               [:option {:value "05"} "Maj"]
                                                               [:option {:value "06"} "Jun"]
                                                               [:option {:value "07"} "Jul"]
                                                               [:option {:value "08"} "Avgust"]
                                                               [:option {:value "09"} "Septembar"]
                                                               [:option {:value "10"} "Oktobar"]
                                                               [:option {:value "11"} "Novembar"]
                                                               [:option {:value "12"} "Decembar"]

                                                      ]
                                                ]
                                                [:div {:class "col-xs-4 col-md-4"}
                                                      [:select {:class "form-control" :name "day"}
                                                               [:option {:value "Day" :disabled "disabled" :selected "selected"} "Dan"]
                                                               (for [i  (range 1 32)]
                                                                 [:option {:value i} i]
                                                                 (inc i))
                                                      ]
                                                ]
                                                [:div {:class "col-xs-4 col-md-4"}
                                                      [:select {:class "form-control" :name "year"}
                                                               [:option {:value "Year"} "Godina"]
                                                               (for [i  (range 1900 2015)]
                                                                 [:option {:value i} i]
                                                                 (inc i))
                                                      ]
                                                ]
                                          ]
                                          [:label {:class "radio-inline"}
                                                  [:input {:type "radio" :name "sex" :id "maleId" :value "male"}]
                                                  "Musko"
                                          ]
                                          [:label {:class "radio-inline"}
                                                  [:input {:type "radio" :name "sex" :id "femaleId" :value "female"}]
                                                  "Zensko"
                                          ]
                                          [:br]
                                          [:br]
                                          [:button {:class "btn btn-lg btn-primary btn-block" :type "submit"} "Registruj se"]


                                   ]
                             ]
                             [:div {:class "modal-footer"}
                             ]
                             ]
                             ]
                       ]

       [:div {:class "navbar navbar-inverse navbar-static-top"}
           [:div {:class "container"}
                 [:a {:href "#" :class "navbar-brand"} "TOP Kladionica"]
                 [:div {:class "navbar-collapse collapse"}
                    [:ul {:class "nav navbar-nav navbar-right"}

                       [:li [:a {:href "#myModal" :data-toggle "modal"} "Registracija"]]

                       [:li {:class "dropdown"}
                            [:a {:href "#" :class "dropdown-toggle" :data-toggle "dropdown" } "Login" [:b {:class "caret"}]]
                            [:ul {:class "dropdown-menu" :style "padding:15px;min-width:250px;"}
                                 [:li
                                     [:div{:class "row"}
                                           [:div {:class "col-md-12"}
                                                 [:form {:class "form" :role "form" :method "post" :action "login" :accept-charset "UTF-8" :id "login-nav"}
                                                         [:div {:class "form-group"}
                                                                [:label {:class "sr-only" :for "inputEmail"} "Email adresa"]
                                                                [:input {:type "email" :class "form-control" :id "inputEmail" :placeholder "Email adresa" }]
                                                         ]
                                                         [:div {:class "form-group"}
                                                                [:label {:class "sr-only" :for "inputPassword"} "Lozinka"]
                                                                [:input {:type "password" :class "form-control" :id "inputPassword" :placeholder "Lozinka" }]
                                                         ]
                                                         [:div {:class "checkbox"}
                                                               [:label
                                                                      [:input {:type "checkbox"} "Zapamti me"]

                                                               ]
                                                         ]
                                                         [:div {:class "form-group"}
                                                               [:button {:type "submit" :class "btn btn-success btn-block"} "Login"]
                                                         ]
                                                 ]
                                           ]
                                     ]
                                 ]
                                 [:li {:class "divider"}]
                                 [:li
                                     [:input {:class "btn btn-primary btn-block" :type "button" :id "sign-in-google" :value "Google prijava"}]
                                     [:input {:class "btn btn-primary btn-block" :type "button" :id "sign-in-twitter" :value "Twitter prijava"}]
                                 ]
                            ]
                       ]
                    ]
                 ]
           ]
        ]
        [:div {:class "navbar navbar-default navbar-fixed-bottom"}
        [:div {:class "alert alert-success alert-dismissable pull-right" :style "display:none"}
             [:button {:type "button" :class "close" :data-dismiss "alert" :aria-hidden "true"} "x"]
             [:strong "Uspijeh!"] "Uspjesno ste se registrovali!"
        ]
       ]
       (include-js "//code.jquery.com/jquery-1.10.2.min.js")
       (include-js "/public/js/bootstrap.js")
       ]
     )
)

2 个答案:

答案 0 :(得分:4)

这里有几件事。

首先,ClojureScript是一种独立的(但相关的)语言,它有自己的编译器,所以你不能只将ClojureScript代码放在Clojure文件中。

其次,需要将ClojureScript编译成JavaScript才能执行任何操作,然后JavaScript需要由JavaScript引擎执行。您可以使用lein-cljsbuild插件进行编译。

要快速简单地介绍ClojureScript,请查看David Nolen的The Essence of ClojureScript。它会让您在几秒钟内启动并运行,您可以查看生成的project.clj文件,看看如果您感到好奇,可以如何为ClojureScript设置项目。

然而,如果你是Clojure的新手,那么在进入ClojureScript之前,最好先熟悉Clojure和Leiningen。你不必,但它可能更容易。

答案 1 :(得分:0)

正如其他用户在此处评论一样,您必须将ClojureScript代码与Clojure代码分开(如果使用cljsbuild构建cljs代码,则标准方式是单独的目录)。

为什么不在同一个文件中使用Clojure和ClojureScript?

这不是确切的问题,因为您在输入时应该将ClojureScript代码视为Clojure代码。问题是,当您尝试在ClojureScript代码中使用外部Clojure库(而不是核心Clojure)时,这样的外部库使用主机JVM类,而ClojureScript使用主机Javascript类。这就是你必须在ClojureScript代码中使用ClojureScript库(适用于JavaScript类的库)的原因,这就是你的文件有点混乱的原因。