Я использую следующую конфигурацию системы:
Chromium 14.0.835.202 в Ubuntu 11.04 с использованием Backbone 0.5.3
Магистральный маршрутизатор со следующими определенными маршрутами и обратными вызовами:
, routes: {
'': 'handlerRoot'
, 'second': 'handlerSecond'
}
В этой системе у меня следующее поведение:
- Если я получаю доступ к «корню» (дому), вызывается «handlerRoot».
Хорошо, это было то, что я ожидал.
- Если я перейду к 'second' (#second), вызывается 'handlerSecond'. в порядке,
это было то, что я ожидал.
- Если я нахожусь в «корне», а затем я перехожу на «второй», и как только я
нажав кнопку «Назад», в результате нажатия кнопки «Назад» два
вызываются обратные вызовы: первый называется handlerSecond, и
следующий 'handlerRoot'. Здесь на самом деле я ожидал, что только
'handlerRoot' вызывается, вызывая мое намерение как пользователя, когда я нажимаю
Кнопка «Назад» должна была вернуться на предыдущую страницу.
- Если я делаю следующий путь: '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', с помощью представление представлено в «корне»). Есть ли способ получить такое поведение?
Заранее спасибо!