2013-05-04 2 views
1

У меня есть один маршрут Сэмми, который распознает произвольное количество параметров. Маршрут выглядит так:Sammy.js с Knockout.js Не работает маршрут с каждым изменением URL-адреса

get(/^\/(?:\?[^#]*)?#page\/?((?:[^\:\/]+\:[^\:\/]+\/?)*)$/g, function() { 
    var params = {}; 
    var splat = this.params.splat[0]; 
    var re = /([^\:\/]+)\:([^\:\/]+)/g; 
    match = true 
    while(match = re.exec(splat)) { 
     params[match[1]] = match[2]; 
    } 
    self.loadData(params); 
}); 

Этот код работает. То, что он делает, это распознавание маршрутов шаблона #page/param1:value1/param2:value2/ для произвольного количества параметров. Моя функция loadData имеет значения по умолчанию для многих из этих параметров. Я уверен, что нет никакой проблемы с фактической загрузкой страниц, так как она работает 100% на многих компьютерах во многих браузерах. Тем не менее, это странное поведение в браузере Android, а также в Safari и Chrome от моего друга Mac (работает на Chrome моего ПК). Я заметил, что это браузеры Webkit.

Поведение заключается в том, что маршрут выполняется правильно для первого изменения URL-адреса, а затем для следующего изменения URL-адреса (хотя URL-адрес в строке браузера действительно всегда меняется), то он снова будет работать для третьего один, и не будет для четвертого. То есть, он работает каждый раз. Это кажется мне очень странным поведением, и я не понимаю, как отладить это. Для определенных ссылок я смог запустить взломать так, что при щелчке я установил местоположение окна в URL-адрес и принудительно выполнил код sammy с runRoute('get', url);. Нецелесообразно добавлять это для каждого события клика на странице, и это в действительности не учитывает все изменения URL. Есть ли что-то, что я могу сделать для отладки, почему мой маршрут не запускается при каждом изменении URL-адреса?

ответ

0

Для тех из вас, кто сталкивается с аналогичным поведением, на каждом другом щелчке в вышеупомянутых браузерах, this.params.splat не был определен. Предполагается, что он должен быть настроен на согласованную часть URL-адреса (например, /#page/param1:value1/).

Рубить я придумал, чтобы справиться с этим, чтобы добавить это к вершине ГЭТ маршруту:

if(this.params.splat === undefined) { 
    app.unload().run(); 
    return; 
} 

Это не добраться до корня проблемы, это просто хак, что позволяет ему повторно запускать маршруты, чтобы params.splat не был определен в следующий раз. Если кто-то получит больше информации о том, что происходит, мне было бы интересно.