Способы экспорта

Я пытаюсь создать объект в javascript и вызвать метод. Имя метода запущено. Я пытался использовать externs.js без везения.

(deftype ^:export SceneMain [] Object (handleShow [_] (display-categories)))
;; should be used in javascript as:
var s = new SceneMain();
s.handleShow();
;; Uncaught TypeError: Object [object Object] has no method 'handleShow'
;; Uncaught TypeError: Object #<dg> has no method 'handleShow'
</dg>

Вот мой externs.js

var SceneMain = {};
SceneMain.handleShow = function() {};
2 ответа

Я использую exportSymbol:

(goog/exportSymbol "SceneMain" SceneMain)
(goog/exportSymbol "SceneMain.prototype.handleShow" SceneMain.prototype.handleShow)

Он работает даже с продвинутыми оптимизациями:

ca("SceneMain",mg);
ca("SceneMain.prototype.handleShow",SceneMain.prototype.Cb);


Не совсем уверен, что вы пытаетесь сделать там.

externs.js полезна, когда вы используете внешнюю библиотеку javascript из Clojurescript, которая не скомпилирована с компилятором Google Closure, основная причина этого в том, что при оптимизации за пределами пробела компилятор не управляет внешней библиотекой.

Возьмем, к примеру, MixPanel Javascript api.

Скажем, у вас есть следующий код cljs, использующий этот api:

(defn track ([name data] (.track js/mixpanel name (clj->js data))) ([name] (.track js/mixpanel name)))

Вы должны определить в своем externs.js

var mixpanel = {}; mixpanel.track = function() {};

Чтобы избежать компиляции Closure, вызывающие вызов этого объекта/функции.

Теперь, если вы хотите вызвать функцию Clojurescript из Javascript, используйте ^:export.

Скажем, у вас есть:

(ns test.cljs)
(defn ^:export testfn [] (.log js/console "test"))

Из javascript вы делаете:

test.cljs.testfn()

licensed under cc by-sa 3.0 with attribution.