2013-03-17 3 views
3

의 원인 navigator.battery.level을 munging된다. 그러나 고급 최적화 모드를 사용할 때 위로 전환됩니다 :구글 폐쇄 컴파일러의 고급 최적화 내가 ClojureScript이와 배터리 레벨을 검색하는 데 사용하고 형식 오류

navigator.hd.rd 

그리고 navigator.hd이 정의되지 같은 형식 오류가 발생합니다.

어떻게 해결할 수 있습니까?

편집 : 아래의 대답

고정 감사합니다. ClosureScript에 내가 ... 성가신, 중첩, agets을 수행해야하지만 그래서 나는이 함께했다 : 도구 이미 거기 경우

(jget js/navigator :battery :level) 

:

(defn jget [jobject & props]  
(loop [obj jobject 
     p (map name props)] 
    (if (not (empty? p))    
     (let [prop (aget obj (first p))] 
      (recur prop (rest p))) 
    obj))) 

다음과 같이이라고 불렀다 거기에 대한 몇 가지 알려 주시기 바랍니다 수 있습니다.

답변

4

다른 해결책은 externs 파일을 작성하는 것입니다.이 파일은 이름을 보존하려는 모든 개체 및 메서드에 대한 참조를 포함하는 JavaScript 파일입니다. 이 경우, JS 파일은 다음과 같이 보일 것이다 :

//resources/externs/navigator.js 
navigator = {} 
navigator.battery = {} 
navigator.battery.level = function(){}; 

을 그리고 당신은 당신의 ClojureScript의 컴파일러 옵션에 참조 것 :

Sirko의 제안 솔루션처럼
:externs ["resources/externs/navigator.js"] 

이 고급 방지 할 수 있습니다 -mode 컴파일은 navigator.battery.level 이름을 변경합니다.

+0

덕분에 나는 통근 파일의 생성을 자동화 할 경우 안전이 문자열 주어진 말을하는 것입니다, levland ".. <1><2>을 <3>"예 "navigator.battery.level를"그, <1> =해야 <1><1>에 파일 이름 . 에는 항상 = {} 및 <1>을 할당해야합니다. <..>. 은 항상 = function() {}에 할당되어야합니다. – jdoig

+0

@jdoig 자동 생성 extern은 그리 쉬운 일이 아닙니다. 위 extern에는 형식 정보 나 중첩 형식이 없습니다. –

2

사용

navigator['battery']['level'] 

이이 이름을 유지합니다.

클로저 컴파일러는 점 표기법 (예 : navigator.battery)의 변수 이름을 바꿔서 사용하지만 대개 괄호 표기법을 사용합니다 (예 : navigator [ 'battery']).

+1

수정하십시오. Closure-compiler는 현재 Battery Status API에 대한 extern을 가지고 있지 않습니다. –