【问题标题】:How to apply backbone router for full path, not a hash如何将骨干路由器应用于完整路径,而不是哈希
【发布时间】:2012-04-05 16:44:51
【问题描述】:

这种可能性存在吗?我们的网站不是一页,而是application.js内压缩的所有js文件,我可以使用骨干路由器来解析location.path吗?

我试试Backbone.history.start(pushState: true)。它对我有用,但它正确吗?我只需要初始解析,而不是通过Backbone.Router 进行复杂的路由和重定向。

【问题讨论】:

  • 你想要完成什么?你能举一些例子和你已经尝试过的吗?
  • 例如,当我打开路径/testimonials 时,我想完成一些功能(在路由器中)。这就是我所需要的,因为我所有的模块都在 application.js 内(它是 rails 应用程序)。我想知道,我应该执行什么......

标签: javascript backbone.js coffeescript


【解决方案1】:

我正在使用这个:

window.location.href.replace(Backbone.history.getFragment(), '');

获取主干应用根目录的绝对网址。

【讨论】:

    【解决方案2】:

    我遇到了同样的 IE 问题,有一个简单的解决方案。下载modernizr 并包含它。

    然后做:

    Backbone.history.start({ pushState: Modernizr.history });
    

    这应该可以解决问题。

    【讨论】:

    • Backbone 会自动检测浏览器是否有 pushState,如果不支持 pushState 则会回退到 hash,所以这是不必要的——只需在 history.start 中将 pushState 设置为 true。
    【解决方案3】:

    您需要编写自己的路由器,但幸运的是这很容易。这是我刚刚为我正在开发的网站写的一篇:

    var routes = {
      "terms": "terms",
      "privacy": "privacy",
      "password-reset": "reset"
    };
    
    var path = window.location.pathname.replace("/", "");
    var page = routes[path];
    if (!page) {
      page = "404";
    }
    

    我不需要 Backbone 提供的任何花哨的匹配规则,但是用正则表达式扩展这个想法并不难。或者也许有人可以编写一个使用 Backbone 的匹配逻辑但不执行 hash/pushState 重定向的小模块。

    【讨论】:

    • 这是一个非常简单的例子。通常,路由并不那么简单,您可能会发现需要提供这样的路由:/hello/world/:post/:date
    【解决方案4】:

    您可以只使用标准路由器。当您实例化它并启动历史对象时,您可以设置它应该用作其基础的根目录。在这种情况下,您似乎想使用 '/'

    var MyRouter = Backbone.Router.extend({
        routes: {
            "application/": "somefunc"
        }
    }
    
    var app = new MyRouter();
    Backbone.history.start({pushState: true, root: '/'});
    

    您需要设置您的网络服务器,以便在您的服务器上调用任何目录时提供您的 HTML 文件(因此骨干网,而不是 Rails 将处理您的路由)。

    最后,在 HTML 文件中,我有一个函数可以在 Dom 上运行,并从 URL 中提取路径并将其传递给 navigate

    var path = location.pathname;
    app.navigate(path, {trigger: true});
    

    【讨论】:

    • IE 有问题... IE 没有 pushState 和 Router 总是转到 #my-path 而不是 /my/path... 是否有可能修复它?
    • @InviS No. pushState 仅适用于支持 HTML5 History 对象的浏览器。 [Backbone 在不受支持的浏览器上将专门恢复为哈希解决方案[(documentcloud.github.com/backbone/#History-start)。不支持pushState的浏览器的问题是,当你通过修改location对象给它一个有效的URL时,浏览器会发出一个新的请求。
    • 但是我根本不需要pushState...我正在使用它来定位我在哪个页面上...有什么方法可以做到吗?如何从根路径/而不是#设置默认导航。
    • @InviS 不需要pushState。当路由器接管您的页面时,它需要更改 location.hash 或使用 History 对象。如果您不使用路由器来处理位置,为什么不直接使用View 来“控制”您的页面。
    • 我解释一下:我有很多页面(Rails 应用程序)并且我正在使用 Sprockets,所有的 javascript 都在 application.js 中。我需要一个路由器来知道我访问了什么页面。我只需要 - 获取初始 url 并检测路由是什么。并执行一些功能。但是骨干路由器默认使用hashchangepushState 完美,但 IE....
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2012-06-12
    • 2012-06-26
    相关资源
    最近更新 更多