2016-06-07 4 views
0

Я пытаюсь Eliom прямо сейчас, чтобы посмотреть, что я могу с ним сделать. Я хочу вызвать внешнюю javascript-библиотеку из моего клиентского кода eliom. Пример кода я пытаюсь следующий:Вызов внешнего Js lib из клиентского кода Eliom

[%%client 
    let three_lib = Js.Unsafe.js_expr "THREE" in 

    let scene2 = Js.Unsafe.new_obj three_lib##.Scene [||] in 

    let init() = 
    (Firebug.console##log three_lib : unit); 
    (Dom_html.window##alert (Js.string "scene2 created") : unit) in 

    init() 
] 

Эквивалент простой JavaScript:

var scene2 = new THREE.Scene(); 
function init() { 
    console.log(THREE); 
    window.alert("scene2 created"); 
} 
init(); 

Простой вызов Three.js из OCaml кода. Теперь я не уверен на 100% синтаксиса, но я наблюдаю, что THREE не определено, потому что этот код выполняется до загрузки Three.js.

Как сделать так: 1) включить файлы js перед тем, который был создан js_of_ocaml; или 2) включать Three.js в сгенерированный файл js; или 3) другой вариант?

В настоящее время страница генерируется таким образом:

Eliom_tools.F.html 
    ~title:"Main Page" 
    ~js:[["lib";"three.min.js"]] 
    Html5.D.(body ....) 

Спасибо заранее

ответ

0

Я нашел происхождение моей проблемы и решения.

Я обнаружил, что проблема заключалась в том, что по умолчанию js-скрипты включены в атрибут «defer» (и таким образом интерпретируются после полной загрузки страницы).

После долгого зондирования, я нашел способ, чтобы генерировать страницу со скриптом интерпретируется перед тем OCaml сгенерированных JS, то он должен быть «вручную» включено:

Eliom_tools.F.html 
    ~title:"Main Page" 
    ~other_head:[Html5.D.script ~a:[a_src 
    (Xml.uri_of_string "lib/three.min.js")] (pcdata "")] 
    Html5.D.(body ....)