如何将此Coffeescript拆分为单独的文件?

时间:2013-07-19 02:08:07

标签: javascript ruby-on-rails coffeescript

使用Garber方法执行DOM:

SITENAME = {
  common: {
    init: function() {
      // application-wide code
    }
  },

  users: {
    init: function() {
      // controller-wide code
    },

    show: function() {
      // action-specific code
    }
  }
};

UTIL = {
  exec: function( controller, action ) {
    var ns = SITENAME,
        action = ( action === undefined ) ? "init" : action;

    if ( controller !== "" && ns[controller] && typeof ns[controller][action] == "function" ) {
      ns[controller][action]();
    }
  },

  init: function() {
    var body = document.body,
        controller = body.getAttribute( "data-controller" ),
        action = body.getAttribute( "data-action" );

    UTIL.exec( "common" );
    UTIL.exec( controller );
    UTIL.exec( controller, action );
  }
};

$( document ).ready( UTIL.init );

我如何在单独的.coffee文件中使用此技术ala Rails管道?

我想做以下

users.js.coffeee

SITENAME =
  users:
    init: ->
      alert("nope")

    index: ->
      alert("hi")

但如果我现在这样做,它只会重写它并强迫我将它全部保存在一个文件中。

如何将其拆分并在此技术中为每个页面使用命名空间?

1 个答案:

答案 0 :(得分:0)

首先,确保将其包含在application.js清单文件中:

//= require global
//= require users

global.coffee包含您的实用程序方法。您的示例users.coffee看起来很好。但是,您需要将SITENAME范围限定为window,以便可以全面访问。

// global.coffee
window.SITENAME = ...

// users.coffee
window.SITENAME.users = ...

你需要这样做,因为CoffeeScript会在它自己的闭包中编译每个文件......从而限制范围,除非你明确地将它分配给窗口。

(function() {
  window.SITENAME.users = {};
}).call(this);