передача URL-адреса в виде хэш-карт в магистральном маршруте?

Я пытаюсь передать местоположение каталога и путь к файлу как часть хэш-карт в магистральных маршрутах. Это URL-адрес с хэш-картами:

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

и это то, что мой маршрут, который отображает указанный выше URL:

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-адреса такого типа? Спасибо!


person codef0rmer    schedule 02.07.2012    source источник


Ответы (1)


Из отличного руководства:

Маршруты могут содержать части параметров, :param, которые соответствуют одному компоненту URL между косыми чертами; и части знака *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/

Второй вариант столкнется с проблемами, когда вы неизбежно получите - внутри вашего directoryPath или filePath; вы можете закодировать встроенные - в URI, чтобы получить их через первый вариант.

person mu is too short    schedule 02.07.2012