0

在我的应用程序中,我有一个控制器支持一个非常复杂的对象,该对象有很多 JavaScript,用 coffescript 编写。

我想将 javascript 安排在几个单独的文件上,以便更好地安排代码,尽管我不知道如何导入这些额外的文件。

例如,我有app/assets/javascripts/general_functions.js.coffee包含以下内容的文件:

# rounds a number
roundNumber = (rnum, rlength = 5) ->
  pow = Math.pow( 10, rlength )
  newnumber = Math.round(rnum*pow)/pow
  parseFloat(newnumber)

# floors a number
floorNumber = (rnum, rlength = 5) ->
  pow = Math.pow( 10, rlength )
  newnumber = Math.floor(rnum*pow)/pow
  parseFloat(newnumber)

# returns true if the str ends with suffix
endsWith = (str, suffix) ->
  str.indexOf(suffix, str.length - suffix.length) !=   -1

# returns the absolute value of a number (always >= 0)
abs = (num) -> 
  if num < 0 then - num else num

如何将它导入app/assets/javascripts/projects.js.coffee需要这些功能的我?

我试过添加

//= require general_functions

to app/assets/javascripts/application.js, 没有成功

有任何想法吗?

谢谢,

4

3 回答 3

1

没有成功,我猜测浏览器告诉您您的general_functions.js.coffee功能都不存在,并且您收到以下错误:

ReferenceError:roundNumber 未定义

你有一个简单的范围问题。CoffeeScript 文件的编译版本被包装在一个自执行函数中以防止命名空间污染,因此:

roundNumber = (rnum, rlength = 5) ->
  pow = Math.pow( 10, rlength )
  newnumber = Math.round(rnum*pow)/pow
  parseFloat(newnumber)

当它到达浏览器时看起来像这样:

(function() {
  var roundNumber;
  roundNumber = function(rnum, rlength) {
    // ...
  };
})();

并且您定义的所有功能都被隐藏了。如果您希望您的函数是全局的,则将它们定义为window属性:

window.roundNumber = (rnum, rlength = 5) ->
  # ...

或者更好的是,您可以在加载主 (Coffee|Java)Script 之前的某处创建一个特定于应用程序的命名空间:

app = { }

并将您的功能放在那里:

app.roundNumber = (rnum, rlength = 5) ->
  # ...
于 2013-07-17T15:42:07.163 回答
0

application.js正确的顺序添加两个文件:

应用程序.js

//= require general_functions
//= require projects

希望这可以帮助!

于 2013-07-17T14:52:26.043 回答
0

Javascript 应该自动包含在您的 Rails 应用程序中,每个控制器都有自己的 js 文件。使用下面的说明将包括它们。

app/assets/javascripts/application.js.coffee应该包含此行:

#= require_tree .

或者app/assets/javascripts/application.js(纯javascript):

//= require_tree .

当您在浏览器中查看页面的源代码时,您应该会看到如下内容:

<script src="/assets/projects.js?body=1"></script>

您所描述的是具有通用功能的帮助程序或更全局的 js 文件。您可以将这些添加到 application.js。此外,使用如下结构将包括 vendor/assets/javascripts/some_generic_feature.js(.coffee)

//= require some_generic_feature
于 2013-07-17T14:41:22.500 回答