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.
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
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
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