По моему мнению, отличия в том, что функции обратного вызова для событий на AppRouter
должны существовать в Controller
вместо того же самого объекта Router. Также существует взаимно-однозначная взаимосвязь между такими AppRouter и контроллерами, все мои коды от Router теперь переходят к контроллеру, я не вижу слишком много этого? Так зачем их использовать? Мне что-то не хватает?
Что является преимуществом Marionette AppRouter + Controller over Backbone.Router?
Ответ 1
Как я вижу это, нужно разделить проблемы:
- контроллер фактически выполняет работу (сбор данных, стимулирование представления, отображение их в регионах и т.д.) и может обновлять URL-адрес для отражения состояния приложения (например, отображаемого содержимого).
- маршрутизатор просто запускает действие контроллера на основе URL-адреса, введенного в адресную строку
Таким образом, если вы находитесь на начальной странице своего приложения, он должен работать нормально, не требуя каких-либо маршрутизаторов: ваши действия (например, нажатие на запись в меню) просто запускают различные действия контроллера.
Затем вы добавляете на маршрутизатор сообщение "если этот URL-адрес вызывается, выполните это действие контроллера". И внутри вашего контроллера вы обновите отображаемый URL с помощью navigate("my_url_goes_here")
. Обратите внимание, что вы не проходите trigger: true
.
Для получения дополнительной информации просмотрите сообщение в блоге Derick http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/ (параграф "Момент AHA!" в отношении маршрутизатора. Обозначает второй аргумент")
Я также затронул тему более подробно в бесплатном предварительном просмотре моей книги о Marionette. См. Стр. 32-46: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf
Ответ 2
Я сделал несколько переопределений для маршрутизатора. И в настоящее время использовать его таким образом (например, Чаплин): https://gist.github.com/vermilion1/5525972
appRoutes : {
// route : controller#method
'search' : 'search#search'
'*any' : 'common#notFound'
},
initialize : function () {
this.common = new Common();
this.search = new Search();
}