События Hashchange с помощью кнопки Back в магистральном маршрутизаторе / истории - PullRequest
3 голосов
/ 28 декабря 2011

Я использую следующую конфигурацию системы:


Chromium 14.0.835.202 в Ubuntu 11.04 с использованием Backbone 0.5.3

Магистральный маршрутизатор со следующими определенными маршрутами и обратными вызовами:

, routes: {

                  '': 'handlerRoot'

                , 'second': 'handlerSecond'
}

В этой системе у меня следующее поведение:


  1. Если я получаю доступ к «корню» (дому), вызывается «handlerRoot». Хорошо, это было то, что я ожидал.
  2. Если я перейду к 'second' (#second), вызывается 'handlerSecond'. в порядке, это было то, что я ожидал.
  3. Если я нахожусь в «корне», а затем я перехожу на «второй», и как только я нажав кнопку «Назад», в результате нажатия кнопки «Назад» два вызываются обратные вызовы: первый называется handlerSecond, и следующий 'handlerRoot'. Здесь на самом деле я ожидал, что только 'handlerRoot' вызывается, вызывая мое намерение как пользователя, когда я нажимаю Кнопка «Назад» должна была вернуться на предыдущую страницу.
  4. Если я делаю следующий путь: 'root' -> 'second' -> 'root' -> «второй», и один раз во «второй» (последний), я нажимаю кнопку «Назад» Кнопки, в результате этого нажатия вызываются следующие обратные вызовы: первый handlerSecond, следующий handlerRoot, следующий 'handlerSecond' и, наконец, 'handlerRoot'. Как и все обратные вызовы, связанные с путями URL в предыдущей истории, вызываются (в обратном порядке). Опять же, мое ожидание называлось только 'handlerRoot' (по той же причине я возвращаюсь из 'second' в root, меня не интересует вся история).

Я просматривал код Backbone.js для History и увидел, что используется событие onhashchange (для совместимых браузеров). Итак, я вручную установил в консоли браузера следующее:


function locationHashChanged() {
                  console.log(window.location.toString()) 
};
window.onhashchange = locationHashChanged;

Я провел те же эксперименты (1), (2), (3) и (4) с этой конфигурацией. Фактически все пути URL в предыдущей истории были напечатаны в обратном порядке. Например, в (3), когда я нажимаю кнопку «Назад», сначала печатается URL-адрес «second», а затем печатается URL-адрес «root». Таким образом, поведение Backbone действительно является поведением onhashchange.

Мой вопрос:

Какая причина этого поведения (для чего оно полезно)? Например, если мои обратные вызовы меняют только представления, в примере (4) я переключаю представления четыре раза, когда мне действительно нужно переключить представления только один раз (измените представление, отображаемое в 'second', с помощью представление представлено в «корне»). Есть ли способ получить такое поведение?

Заранее спасибо!

1 Ответ

1 голос
/ 28 декабря 2011

РЕДАКТИРОВАТЬ : после поиска по множеству, Chromium имеет только ошибку на консоли с кнопкой возврата, маршрут запускается один раз, как и другие браузеры.


Iсоздал jsFiddle, чтобы попытаться решить вашу проблему, и я не вижу проблемы.

Я проверял это с Chrome, Firefox и Opera на Linux 10.04, и в этом нет ничего плохого ... но в Chromium (15.0.874.106) есть ошибка с кнопкой возврата.Поэтому я думаю, что Chromium неправильно интерпретировал объект истории из Backbone JS.

Я ответил на вопрос о репозитории GitHub, чтобы открыть его здесь: https://github.com/documentcloud/backbone/issues/646#issuecomment-3291944

...