2013-03-17 3 views
3

Я использую ClojureScript для получения уровня заряда батареи с:Google закрытоугольной компилятор расширенных оптимизаций munging navigator.battery.level вызывает TypeError

navigator.battery.level 

Который прекрасно работает при использовании простых и пробельные оптимизаций. Но при использовании расширенного режима оптимизации выше преобразуемый:

navigator.hd.rd 

И вызывает TypeError, как navigator.hd не определено.

Как это исправить?

EDIT:

Фиксированные благодаря ниже ответ. Хотя в ClosureScript я должен был бы сделать некоторый неприятный, вложенный, agets ... Так что я пришел с этим:

(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))) 

тогда назвал это так:

(jget js/navigator :battery :level) 

Если уже есть инструменты из там для этого может кто-нибудь, пожалуйста, дайте мне знать.

ответ

4

Другое решение - написать файл externs, который является файлом JavaScript, который содержит ссылки на все объекты и методы, имена которых вы хотите сохранить. В этом случае файл JS будет выглядеть примерно так:

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

И вы бы обратиться к нему в параметрах компилятора ClojureScript как:

:externs ["resources/externs/navigator.js"] 

Как предложенное решение Сирко, это позволит предотвратить расширенное -mode компиляции из munging имя navigator.battery.level.

+0

Благодаря levland, если я хочу, чтобы автоматизировать поколение Экстерн файлов безопасно сказать, что с учетом строки: «. <1><2><3>», например: «navigator.battery.level» Это имя файла должно = <1>, <1> к <1> , всегда должно быть назначено = {} и <1>. <..>. всегда должен быть назначен = function() {}. – jdoig

+0

@ jdoig Автоматическое создание внешнего интерфейса не так просто. Вышеприведенный extern не содержит информации типа или вложенных типов. –

2

Использование

navigator['battery']['level'] 

это сохранит именование.

Компилятор закрытия чаще всего будет переименовывать переменные точечной нотации (например, navigator.battery), но сохраните их, он знает или использует обозначения в виде скобок (например, навигатор ['battery']).

+1

Исправить. У Closure-compiler в настоящее время нет внешних компонентов для API состояния батареи. –