在CoffeeScript中引用跨AMD模块的非全局变量

时间:2014-05-18 14:57:29

标签: coffeescript requirejs

我在CoffeeScript中编写一个应用程序,主要对象声明为:

App =
  Models: {}
  Views: {}
  Collections: {}
  start: ->
    console.log('started')
    null

require ['models/question', 'views/question'], ->
  new App().start()
  null

此代码编译为这样的javascript:

(function() {
  var App;
  App = {
    Models: {},
    Views: {},
    Collections: {},
    start: function() {
      console.log('started');
      return null;
    }
  };

  require(['models/question', 'views/question'], function() {
    new App().start();
    return null;
  });

}).call(this);

在型号代码中"必需"在这个程序中,Coffeescript及其编译看起来像这样:

#Coffeescript
    App.Model.Question = Backbone.Model.extend(
      defaults : ->
        question: "How're you"
    )


//Javascript

(function() {
  App.Model.Question = Backbone.Model.extend({
    defaults: function() {
      return {
        question: "How're you"
      };
    }
  });

}).call(this);

由于coffeescript编译的方式,编译代码中没有全局变量。因此,当问题模型页面加载时,它会抛出一个错误:在浏览器控制台中:

Uncaught ReferenceError: App is not defined

我不知道如何解决这个问题,因为我的项目中有很多模块的引用。在使用coffeescript时,如何确保模块间的可见性。

2 个答案:

答案 0 :(得分:0)

"在没有顶级功能安全包装的情况下编译JavaScript"将-b--bare标志传递给编译器。 See Usage section of documentation

答案 1 :(得分:0)

您只需将其设置为全局或“命名空间”即可。

window.MyNamespace = {}
window.MyNamespace.App = App