0

使用 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 );

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

我想做以下

users.js.coffee

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

    index: ->
      alert("hi")

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

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

4

1 回答 1

0

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

//= require global
//= require users

global.coffee 保存您的实用程序方法的位置。您的示例 users.coffee 看起来不错。但是,您需要将 SITENAME 限定为window可以全面访问它。

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

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

您需要这样做,因为 CoffeeScript 将在其自己的闭包内编译每个文件......从而限制范围,除非您将其显式分配给 window.

(function() {
  window.SITENAME.users = {};
}).call(this);
于 2013-07-19T13:21:45.073 回答