2013-03-15 1 views
5

clojure 및 clojurescript로 RIA를 개발하고 있습니다. 백엔드 Ajax 호출을 수행하지 않고 생성 된 HTML, 즉 내 clojurescript하는ajax 요청없이 (즉 딸꾹질 생성 페이지를 통해) clojure에서 clourescript에 edn을 전달할 수 있습니다.

(html5 
[:head 
    (include-js "/js/my-cljs-generated.js")] 
[:body ... ]) 

어떻게 (해시 맵 등, 벡터)를 통과 할 수 EDN처럼 결과 HTML을 생성하는 데 사용 딸꾹질? 내가 딸꾹질을하고 싶다

는 다음과 같이 수행합니다. (예 : 이름)

(include-edn 
    "var_name" {:foo :bar}) ; or any other clojure data 

어떻게 든 cljs에서 전달 된 EDN에 액세스 할 수 있습니다.

현재 내 구현은 해키 저장 EDN 글로벌 JS의 VAR에 조금

(hiccup/javascript-tag (str "var edn = \"" 
         (pr-str my-clojure-data) "\";"))   

및 cljs 측

(jayq/document-ready 
    (fn [] 
    (if-let [edn (.-edn js/window)] 
     (do-something-with (cljs.reader/read-string edn)) 
    ) 
    ... 
) 

같은 떨어지게 어쩌면이 달성의 더 관용적 방법이 무엇입니까?

답변

1

"구현"은 완벽합니다. 그것이 당신을 더 편안하게 느끼게한다면 함수로 감싸겠습니다 :

대신 ClojureScript를 컴파일합니다. 값은 여전히 ​​전역 적이며 변경 될 수 있습니다.

1

pull보다는 push (이벤트 기반) 접근 방법을 고려해 볼 수 있습니다. 생성 된 edn 데이터를 javascript 호출의 clojurescript 함수에 대한 인수로 [: script] 태그 안에 문자열로 저장하십시오. 스크립트가 브라우저에 의해로드 될 때 edn을 핸들러 함수에 전송하여 응용 프로그램에서로드 할 수있게합니다.

이것은 주 또는 글로벌 데이터가 필요하지 않으므로 현재 접근법보다 조금 더 관용적이며 필요할 경우 나중에 아약스를 사용하도록 쉽게 조정할 수 있습니다.

+1

나는 푸시 기반 접근 방식이 더 관용적이라고 동의하지 않습니다. 예를 들어 core.async는 콜백에 의해 일반적으로 도입되는 제어 반전을 최소화하려고 시도합니다. –

2

당신의 접근 방식이 좋습니다. JavaScript 코드를 수동으로 생성하는 것에 대해 염려가된다면, 대체 정의는 잘 정의 된 요소에 데이터로 pr-str의 결과를 넣는 것입니다. 의 라인을 따라 뭔가 :

(defn get-data 
    [tag] 
    (-> (.getElementById js/document "server-originated-data") 
     (.getAttribute (str "data-" tag)) 
     (cljs.reader/read-string))) 

비록, 다시, 당신의 접근 방식은 괜찮 :

[:div {:style {:display "hidden"} 
     :id "server-originated-data" 
     :data-var-1 (pr-str var-1) 
     :data-var-2 (pr-str var-2)}] 

당신은 다음과 같은 뭔가 ClojureScript에서 데이터를 얻을 수 있습니다.