Rails资产预编译将函数从全局作用域中移除(TypeError: object不是函数).如何把他们找回来



我有这样一个js代码:

function Global(params) {
    ...
}
var g = {
   onDocLoad: function() {
      // on DOM load I instantiate the Global function-constructor
      // which is above this line, so it is already in scope
      var global = new window.Global(params);
}
window.addEventListener("load", g.onDocLoad, false);

如果我使用这个文件作为静态文件,不进行预编译,一切都可以正常工作。

如果我预编译它:

rake assets:precompile:all RAILS_ENV=development

然后刷新页面,得到:

Uncaught TypeError: object is not a function

正好和new window.Global(params);在同一条线上。它说Global不是一个函数。但这不可能是真的。它是一个函数。

我调试了这一行,发现在到达这一行的时候,Global在全局范围内是null。没有这样的函数具有这样的名称

我的问题与这些问题相似:

Javascript "Uncaught TypeError: object不是一个函数"结合性问题

运行rake assets预编译后,在not a function中得到undefined

但是他们的解决方案不适用于我的情况。

可能是什么问题?为什么预编译会破坏工作代码?

所以,我已经学会了如何避免它。但我不知道为什么会这样。

在开发模式中,资产按照清单文件中指定的顺序作为单独的文件提供服务。这个清单:

//= require core
//= require projects
//= require tickets

将生成以下HTML,三个require -三个独立的标签:

<script src="/assets/core.js?body=1" type="text/javascript"></script>
<script src="/assets/projects.js?body=1" type="text/javascript"></script>
<script src="/assets/tickets.js?body=1" type="text/javascript"></script>

但是带串联的链轮不是不带串联的链轮(如上所述)。如果你想连接文件,你必须关闭调试模式:

config.assets.debug = false

当调试模式关闭时,链轮连接并在所有文件上运行必要的预处理器。关闭调试模式后,上面的清单将生成:

<script src="/assets/application.js" type="text/javascript"></script>

现在三个独立的文件合二为一了。

解决方案:

所以我试了

config.assets.debug = false
// and then
rake assets:precompile:all RAILS_ENV=development

,错误消失。

我认为原因在于文件的顺序。与debug = true预编译失去正确的文件序列,尽管事实上,正确的序列是在我的清单表示(这只不过是一个简单的js文件,somefile.js,你添加到你的页面;

相关内容

  • 没有找到相关文章

最新更新