Сафари запускает магистральный маршрут дважды

У меня болит голова с Backbone роутером в Safari

У меня есть этот кусок кода:

app.navigate("ask/" + encodedSearchKey,true);

и в моем роутере:

var AppRouter = Backbone.Router.extend({

  routes:{
    "":"main",
    "ask/*encodedSearchKey":"askSearch",
  },

  askSearch:function(){
    ...
  },
  ...

});
app = new AppRouter();
Backbone.history.start();

В chrome он работает как положено, URL маршрутизируется и функция askSearch вызывается один раз

однако в Safari функция askSearch фактически выполняется дважды

и когда я попробовал

app.navigate("ask/" + encodedSearchKey,false);

В chrome функция askSearch была вызвана не так, как ожидалось, но Safari вызывается один раз.

Я пробежал через отладчик и уверен, что строка app.navigate всегда вызывается только один раз, и нет ничего другого, что могло бы вызвать функцию askSearch, кроме самого маршрутизатора

теперь я знаю, что могу исправить это, обнаружив тип браузера, но я не нашел подобных проблем в Интернете, кажется, что у людей нет этой проблемы, я делаю что-то очень неправильно здесь?

3 ответа

Решение

navigate Второй аргумент функции не логический, а объект option:

app.navigate("ask/" + encodedSearchKey, {
    trigger: true
});

Я думаю, что я только что столкнулся с той же проблемой и нашел решение... Safari, кажется, удаляет строку из URL для тщеславных целей, это затем повторно запускает маршрутизатор, вызывая повторное отображение представления, но без данных строки запроса,

Решение, которое я использовал, было довольно простым в маршрутизаторе:

myView: function () {
    if (window.location.search.length) {
        myView.render();
    } else {
        return false;
    }
}

Это останавливает 2-й рендер от продолжения. Хотя это действительно применимо только в том случае, если вы хотите отображать это представление только с помощью строки запроса.

В Firefox URL не закодирован, маршрут будет срабатывать дважды, несколько раз...

Другие вопросы по тегам