面向多个路由器的Backbone with Rails 3.x中的问题

时间:2013-10-21 11:49:06

标签: javascript ruby-on-rails backbone.js coffeescript backbone-routing

在其中一个rails应用程序中,我尝试使用带有“rails-backbone”gem的骨干, 我用脚手架创建了一个模型,工作正常。 但我有另一个模型,我试图使用不同的路由器,但当试图从index.html.erb实例化该路由器时,它会触发, “Uncaught TypeError:undefined不是函数”,这显然意味着没有这样的路由器。但它存在,甚至在开发人员的工具中它显示了那些JS文件。我尝试了所有不同的方法但它没有用。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我猜你正在定义你的路由器:

class SomeRouter extends Backbone.Router
  # router code goes here

然后你试图创建一个:

r = new SomeRouter

但CoffeeScript会将您的文件包装在function to prevent scope creep

  

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

     

如果您要为其他要使用的脚本创建顶级变量,请将它们作为属性添加到窗口或CommonJS中的 exports 对象上。 存在运算符(如下所述)为您提供了一种可靠的方法来确定添加它们的位置;如果您同时定位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

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