0

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

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 的正确方法是什么?谢谢!

4

1 回答 1

1

来自精美手册

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

你的问题是一个 splat 吃掉了所有东西,所以在一条路线上有两个 splat 是没有意义的;您不能使用参数部分,: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/

第二种选择会遇到问题,你不可避免地会-在你的directoryPathor filePath; 您可以通过 URI 编码嵌入-的 s 以通过第一个选项来获取它们。

于 2012-07-02T18:47:13.967 回答