如何使用资产管道在导轨中导入javascript [英] How to import javascript in rails with asset pipeline

查看:151
本文介绍了如何使用资产管道在导轨中导入javascript的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我想安排javascript在几个单独的文件,使代码布置得更好,虽然我不知道如何导入这些额外的文件。



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

 #舍入数字
roundNumber =(rnum,rlength = 5) - >
pow = Math.pow(10,rlength)
newnumber = Math.round(rnum * pow)/ pow
parseFloat(newnumber)


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

# str结尾有后缀
endsWith =(str,suffix) - >
str.indexOf(suffix,str.length - suffix.length)!= -1

#返回数字的绝对值(总是> = 0)
abs =(num) - >
if num < 0 then - num else num

如何将其导入我的需要这些功能的资产/ javascripts / projects.js.coffee



我尝试添加

  // = require general_functions 

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





感谢,

解决方案

em>我猜想浏览器告诉你,你的 general_functions.js.coffee 函数不存在,你会得到错误,如:


ReferenceError:roundNumber未定义


问题。 CoffeeScript文件的编译版本包装在自动执行的函数中,以防止命名空间污染,因此:

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

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

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

并且隐藏您定义的所有函数。如果你想要你的函数是全局的,然后将它们定义为 window 属性:

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

或者更好地,您可以在之前创建一个特定于应用程序的命名空间加载main(Coffee | Java)脚本:

  app = {} 



并将您的函数放在其中:

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


in my app I have one controller supporting a quite complex object that has a lot of javascript, written in coffescript.

I would like to arrange the javascript on several separate files so to have the code arranged more nicely, although I can't figure out how to import these extra files.

for example I have the file app/assets/javascripts/general_functions.js.coffee containing the following:

# 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

How do I import it in my app/assets/javascripts/projects.js.coffee that needs these functions?

I've tried with adding

//= require general_functions

to app/assets/javascripts/application.js, with no success

any ideas?

thanks,

解决方案

By no success I'm guessing that the browser is telling you that none of your general_functions.js.coffee functions exist and you're getting errors like:

ReferenceError: roundNumber is not defined

You have a simple scoping issue. The compiled version of CoffeeScript files are wrapped in a self-executing function to prevent namespace pollution so this:

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

looks like this when it gets to the browser:

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

and all the functions you've defined are hidden. If you want your functions to be global, then define them as window properties:

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

Or better, you can create an application-specific namespace somewhere before the main (Coffee|Java)Script is loaded:

app = { }

and put your functions in there:

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

这篇关于如何使用资产管道在导轨中导入javascript的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆