1

我想在JavaScript中創建對象並調用的方法。方法名稱已消失。我試圖無緣運用externs.js。出口DEFTYPE方法

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

這裏是我的externs.js

var SceneMain = {}; 
SceneMain.handleShow = function() {}; 

回答

1

我用exportSymbol:

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

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

它具有先進的優化工作,即使

4

不完全知道你要完成那裏。

externs.js當你使用一個外部從Clojurescript JavaScript庫無法與谷歌的關閉編譯器編譯是非常有用的,因爲這主要的原因是用於優化超出空格時,編譯器不重整外部庫。

就拿MixPanel Javascript API。

假如你有使用API​​以下cljs代碼:

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

您需要先定義你externs.js

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

爲了避免Closure編譯器重整調用該對象/功能。現在

,如果你想從JavaScript調用一個Clojurescript功能,採用^:export會做。

假設你有:

(ns test.cljs) 

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

從JavaScript這樣做:

test.cljs.testfn() 
+1

我想要得到閉包編譯器不會破壞handleShow函數名稱,這裏有一個javascript用法的例子。這似乎是一個已知的問題 - http://dev.clojure.org/jira/browse/CLJS-698 – edbond