2017-11-04 13 views
1

私common.cljcファイルには、次のようになります。値は常にnull

(ns example.common 
    #?(:cljs 
    (:require [goog.dom :as gdom]) 
     ) 
    ) 

    #?(:cljs (enable-console-print!)) 

    (defn mobile? [] 
     #?(:cljs (def hvpsize (.. (gdom/getViewportSize) -height))) 
     #?(:cljs (def wvpsize (.. (gdom/getViewportSize) -width))) 
     #?(:cljs (if (<= (/ wvpsize hvpsize) 1) true false)) 
    ) 

    (def mobile-value (mobile?)) 

    (println "mobile-value inside .cljc") 
    (println mobile-value) 

マイroutes.cljファイルは次のようになります。リロードするとき

 (ns example.routes 
     (:gen-class) 
     (:use compojure.core 
       example.views 
       example.common 
       [hiccup.middleware :only (wrap-base-url)]) 
     ) 

     (use '[ring.util.response :only [response]]) 
     (use '[ring.adapter.jetty :only [run-jetty]]) 
     (require '[compojure.route :as route]) 

     (defn -main 
      "I don't do a whole lot ... yet." 
      [& args] 
      (println "Hello, World!")) 

     (defn d-or-m-version [] 
      (.println System/out "Inside d-or-m-version") 
      (.println System/out mobile-value) 
      (if mobile-value (root-page-mobile) (root-page-desktop)) 
      ) 

     (defroutes main-routes 
      (GET "/" [] (d-or-m-version)) 
      (route/not-found "404")) 

     (defonce server (run-jetty #'main-routes {:port 8080 :join? false})) 

mobile-valueを正しく評価します.cljcファイル内のページ、さらには別の.cljsファイルにもあります。

mobile-valueがroutes.cljで評価されるときに問題が発生するのはnullだけです。したがって、d-or-v-versionのifステートメントは、別のviews.cljファイルから正しいhiccup htmlを呼び出さない。

mobile-valueは値がないのに対し、routes.cljはcommon.cljcより前に実行されるため、mobile-valueはnullを返すと仮定しています。しかし、私はこれを解決する方法は考えていない、どんな助けも認められるだろう。

答えて

4

Clojureから呼び出されると、nilと評価されます。これはClojureの空の関数であるためです。 #?(:cljsリーダー条件は、Clojureコンパイラにのみ評価されるはずであるため、このフォームを無視するようにClojureコンパイラに指示します。

この関数のフォームはすべてClojureコンパイラには存在しないため、この関数は空で、常にnilと評価されます。

+0

ああ、意味があり、応答に感謝します。とにかく 'mobile 'にブール値を捕まえることができるのですか?それはclojureコンパイラが評価できる方法ですか?あるいは、問題を解決するための別の方法でしょうか? ユーザーがモバイルであるかどうかを判断できる唯一の方法は、cljを使ってjs libsを使用することですが、すべてのルートはcljになければなりませんので、お互いに話をするのは避けられないようですまた一般的な)問題です。 – user2176152

+0

私はそれがモバイルかどうか、クライアントがサーバーに伝える必要があると思います。つまり、サーバーのコンパイル時の問題ではありません。 – Bill

+0

しかし、そのクライアントが最終的にサーバーに「この特定のhtml/cssをモバイル上のルートパスページにロードする」必要がある場合は、この問題にぶつかることなくクライアントからサーバーにその値をどのように交換すればよいでしょうか?申し訳ありませんが、何か基本的なことを誤解しているかもしれません。 – user2176152