在骨干路由中将url作为哈希映射传递?

时间:2012-07-02 13:34:30

标签: backbone.js backbone-routing

我正在尝试将目录位置和文件路径作为骨干网路由中的哈希映射的一部分。这是带有哈希映射的网址:

localhost/index.html#directory-http://localhost/foobar-html/foo.html

这就是我的路线映射上面的网址:

routes: {
    'directory-*directoryPath-*filePath': 'render'
},

render: function (directoryPath, filePath) {
    // I get the entire url in directoryPath variable
    // http://localhost/foobar-html/foo.html
    // and filePath is empty.
}

映射此类哈希URL的正确方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

来自fine manual

  

路由可以包含参数部分:param,它们匹配斜杠之间的单个URL组件;和splat部分*splat,可以匹配任意数量的URL组件。

你的问题是,啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪你不能使用参数部分:x,因为它以斜线停止。

你可以做一些事情。

  1. 您可以对链接中的斜杠进行URI编码并使用参数部分。 URL如下所示:

    #directory-http:%2f%2flocalhost%2ffoobar-html%2ffoo.html
    

    并且路由器将是这样的:

    routes: {
        'directory-:directoryPath-:filePath': 'render'
    },
    render: function(d, f) {
        d = decodeURIComponent(d);
        f = decodeURIComponent(f);
        //...
    }
    

    演示:http://jsfiddle.net/ambiguous/xBnaN/

  2. 您可以使用route将路线添加为正则表达式,这样可以更自由地构建模式。例如,像这样的片段:

    #directory-http://localhost/foobar-html/foo.html
    

    可以使用这样的路由器处理:

    initialize: function() {
        this.route(/directory-(.*?)-(.*)/, 'render');
    },
    render: function(d, f) {
        //...
    }
    

    演示:http://jsfiddle.net/ambiguous/r8MBb/

  3. 第二个选项会遇到问题,你不可避免地会在-directoryPath内找到filePath;你可以对嵌入式-进行URI编码,以通过第一个选项。