0

我有这样一个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不是一个功能。但这不可能是真的。它是一个函数。

我调试了那条线,发现在到达这条线时,Globalnull在全局范围内。没有这样一个名字的函数。

我的问题类似于这些问题:

Javascript“未捕获的类型错误:对象不是函数”关联性问题

运行 rake 资产预编译后,在非函数中未定义

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

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

4

1 回答 1

0

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

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

//= 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>

但是具有串联的 Sprocket 不是没有串联的 Sprocket(如上)。如果要连接文件,则必须关闭调试模式:

config.assets.debug = false

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

<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您添加到页面;他们只是将其称为清单),但预编译会丢失正确的文件序列。

于 2013-05-03T19:19:14.010 回答