javascript - 将 clojurescript 集成到 javascript 框架中

标签 javascript jquery constructor prototype clojurescript

我想使用 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 functionK 是 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/

相关文章:

jquery - 同时平滑地重新排序并在悬停时出现新的词段

java - 未定义的构造函数(java)

javascript - 如何使用 Angularjs 将数据库中的字符串转换为 XML

javascript - 如何检测 google maps PolyLine 叠加层上的点击事件?

jquery - 使用灯箱单击图像时如何确保图像尺寸变大

jquery - div 的高度未被 jquery 覆盖

c++ - C++中带初始化参数的构造函数

java - 类中的构造函数重载

javascript - js中如何确保用户输入的是有效字符串

javascript - 如何循环遍历geojson数据并根据条件显示属性值