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