我想使用 Clojurescript 在 Javascript 框架内编写一个组件,但我不知道如何在对象内创建构造函数和调用全局变量。
框架通过从保存的 jason 文件中读取它们的状态并在 javascript 中具体化它们来创建 View (在它们自己的 .js 文件中)( View 是这样的代码):
(function() {
var Title = function(json) {
view.View.call(this, json); // view is defined in another js file - global namespace
this.title = json.title;
this.el.addClass("title");
}
view.inherit(view.View, Title);
view.Title = Title;
view.types.Title = Title;
Title.prototype.json = function() {
return $.extend(view.View.prototype.json.call(this), {
type: 'Title',
title: this.title
});
}
Title.prototype.reflow = function() {
this.h2.quickfit(opts);
}
})();
我已经看到您如何使用 deftype 宏和对象创建 Javascript 对象:
(deftype Foo [a b c]
Object
(bar x (+ a b c x)))
我是 javascript 和 clojurescript 的新手。我看到包装所有内容的匿名函数为 View 提供了一个范围,但不确定如何(或者如果我需要)所以在 clojurescript 中有一些等效的东西。
所以我的问题是: 如何在此模型中为 Title 创建构造函数? 我应该如何处理对 View 变量的调用,例如 view.inherit 等?
谢谢
最佳答案
这个答案有点笼统,但您似乎想在 ClojureScript 和 JavaScript 之间共享代码,所以这里是 Using JavaScript Libraries in Clojure 上的入门书和一些精选花絮。 :
导出
保护您声明的符号不被重命名很容易;只需在任何 ClojureScript var 上定义 :export
元数据,ClojureScript 编译器将确保它不会被篡改。
例如,一个函数可以这样声明:
(ns example)
(defn ^:export hello [name]
(js/alert (str "Hello," name "!")))
然后它可以通过相同的名称在外部 JavaScript 上下文中使用:
<script>
example.hello("Eustace")
</script>
外部人员
为了走另一条路,并在您的代码中引用外部声明的变量,您必须为 Google Closure 编译器提供一个“外部文件”,一个定义不会被修改的 javascript 变量的 .js 文件。该文件被传递给 Google Closure 编译器,在编译时,它不会修改其中定义的任何名称。
例如,我可以尝试在没有外部文件的情况下在高级模式下编译以下 ClojureScript(利用 Raphael.js 库)。
(defn test []
(let [raphael (js/Raphael. 10 50 320 200)]
(. raphael (circle 50 50 50))))
当我调用 test
函数时,它会抛出一个 javascript 错误,提示 new Raphael(10, 50, 320, 200)).K is not a function
。 K
是 Raphael 的 circle 函数的修改后的名称,显然找不到,因为它没有在任何地方定义。我们需要告诉编译器保留名称 circle,而不是修改它。
我可以通过创建以下 externs.js 文件来做到这一点:
var Raphael = {};
Raphael.circle = function() {};
并在编译我的 ClojureScript 时使用它:
(closure/build "src/cljs" {:optimizations :advanced
:externs ["externs.js"]
:output-to "helloworld.js"})
关于javascript - 将 clojurescript 集成到 javascript 框架中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15445364/