在我的应用程序中,我有一个控制器支持一个非常复杂的对象,它有很多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
到app/assets/javascripts/application.js
,没有成功
任何想法?
谢谢,
答案 0 :(得分: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) ->
# ...
或者更好的是,您可以在加载main(Coffee | Java)脚本之前的某个位置创建特定于应用程序的命名空间:
app = { }
并将你的功能放在那里:
app.roundNumber = (rnum, rlength = 5) ->
# ...
答案 1 :(得分: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
答案 2 :(得分:0)
在application.js
中按正确顺序添加两个文件:
的application.js
//= require general_functions
//= require projects
希望这有帮助!