0

在其中一个 rails 应用程序中,我尝试将骨干与“rails-backbone”gem 一起使用,并且我使用脚手架创建了一个模型,该模型运行良好。但我有另一个模型,我正在尝试使用不同的路由器,但是当尝试从 index.html.erb 实例化该路由器时,它会触发, “Uncaught TypeError: undefined is not a function”,这显然意味着没有这样的路由器. 但它就在那里,甚至在开发人员的工具中它也显示了那些 JS 文件。我尝试了所有不同的方法,但没有奏效。提前致谢。

4

1 回答 1

1

我猜你是这样定义你的路由器的:

class SomeRouter extends Backbone.Router
  # router code goes here

然后您尝试使用以下方法创建一个:

r = new SomeRouter

但是 CoffeeScript 会将您的文件包装在一个函数中以防止范围蔓延

尽管为了清楚起见在本文档中进行了隐藏,但所有 CoffeeScript 输出都包装在一个匿名函数中: (function(){ ... })();这个安全包装器与var关键字的自动生成相结合,使得意外污染全局命名空间变得非常困难。

如果您想创建顶级变量供其他脚本使用,请将它们作为属性附加到window或CommonJS 中的导出对象上。存在运算符(如下所述)为您提供了一种可靠的方法来确定在何处添加它们;如果您同时针对 CommonJS 和浏览器:exports ? this

该包装器将隐藏在一个函数内,因此在定义它的文件之外SomeRouter将不可见。SomeRouter

Rails/Backbone 应用程序中的一个常见解决方案是自己管理命名空间。在引入任何其他 (Java|Coffee) 脚本之前在某处设置您自己的命名空间:

# AppName is just a placeholder, you'd use something more
# sensible in real life.
window.AppName =
    Routers:     { }
    Views:       { }
    Models:      { }
    Collections: { }

然后将您的路由器定义为:

class AppName.Routers.SomeRouter extends Backbone.Router
    #...

然后:

r = new AppName.Routers.SomeRouter

与需要全局可见的模型、集合和视图类似。

于 2013-10-21T18:23:41.570 回答