2017-11-04 4 views
1

Meine common.cljc Datei sieht wie folgt aus:Wert von .cljc aufgerufen .clj immer 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) 

Meine routes.clj Datei sieht wie folgt aus:

 (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 korrekt auswertet beim Nachladen die Seite in der .cljc-Datei und sogar in einer separaten .cljs-Datei, die ich habe.

Das Problem ist, wenn mobile-value in routes.clj ausgewertet wird, gibt es nur Null zurück. Daher ruft die if-Anweisung in d-or-v-version nicht das korrekte hiccup html aus einer separaten views.clj-Datei auf.

Ich gehe davon aus, mobile-value gibt Null zurück, da routes.clj vor common.cljc ausgeführt wird, während mobile-value keinen Wert hat. Jedoch habe ich keine Idee, wie man das löst, jede Hilfe würde geschätzt werden.

Antwort

4

Es wird nil ausgewertet, wenn es von Clojure aufgerufen wird, da es eine leere Funktion in Clojure ist. Die Leserechte #?(:cljs weist den Clojure-Compiler an, dieses Formular zu ignorieren, da es nur vom Clojurescript-Compiler ausgewertet werden soll.

Da alle Formulare in dieser Funktion für den Clojure-Compiler nicht vorhanden sind, ist die Funktion leer und wird immer auf ausgewertet.

+0

Ah macht Sinn und danke für die Antwort. Kann ich diesen booleschen Wert in 'mobile? 'Auf eine Weise erfassen, die der clojure-Compiler auswerten kann? Oder vielleicht eine andere Möglichkeit, das Problem anzugehen? Die einzige Möglichkeit, zu erkennen, ob der Benutzer mobil ist oder nicht, ist die Verwendung von js libs über cljs, aber alle meine Routen müssen in clj sein, so dass sie miteinander sprechen zu können scheint unvermeidlich (aber auch gemeinsames) Problem. – user2176152

+0

Ich denke, Sie müssten den Client dem Server mitteilen, ob er mobil ist oder nicht. Es handelt sich also nicht um eine Kompilierungszeit für Ihren Server. – Bill

+0

Aber wenn dieser Client schließlich den Server "Hey Laden Sie diese spezifische HTML/CSS für die Root-Pfad-Seite auf Handy" sagen muss, wie kann man diesen Wert von Client zu Server austauschen, ohne in dieses Problem zu laufen? Tut mir leid, ich verstehe etwas Grundlegendes falsch. – user2176152