【问题标题】:Facing issues in Backbone With Rails 3.x, for multiple routers在 Backbone With Rails 3.x 中面临多个路由器的问题
【发布时间】:2013-10-21 11:49:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    class SomeRouter extends Backbone.Router
      # router code goes here
    

    然后您尝试创建一个:

    r = new SomeRouter
    

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

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

    如果您想创建顶级变量供其他脚本使用,请将它们作为属性附加到 window 或 CommonJS 中的 exports 对象上。 existential operator(如下所述)为您提供了一种可靠的方法来确定在何处添加它们;如果您同时针对 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
    

    对于需要全局可见的模型、集合和视图也是如此。

    【讨论】:

    • 感谢它给了我道路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多