Marionette.AppRouter
Роутер в Marionette должен быть “тонким”, то есть из него должна быть исключена любая бизнес-логика. Задача роутера сводится к вызову нужного метода контроллера, который задается при объявлении роутера.
Содержание
- Настройка роутов
- Настройка роутов в конструкторе
- Добавление роутов при выполнения приложения
- Указание контроллера
- Коллбэк onRoute
Объявление роутов
Для объявления роутов необходимо задать параметр appRoutes
. Это просто объект,
ключами которого являются имена роутов, а значениями - имена обработчиков, то есть
объявление роутов в Marionette.AppRoute
аналогично объявлению роутов в
Backbone.Router
. Однако, в отличие от Backbone, где роуту назначается один из методов самого роутера, в Marionette роуту назначается один из методов контроллера, указанного при создании роутера.
var MyRouter = Marionette.AppRouter.extend({
// "someMethod" должен существовать как controller.someMethod
appRoutes: {
"some/route": "someMethod"
},
/* Так же можно задать и обычные роуты */
routes: {
"some/otherRoute": "someOtherMethod"
},
someOtherMethod: function(){
// тело метода
}
});
В AppRouter
можно указать обычные роуты Backbone (объект routes
), но в этом
случае обработчики должны быть заданы как методы самого роутера, а не в
контроллере.
Объявление роутов в конструкторе
Также роуты могут быть заданы с помощью аргументов функции конструктора.
Для этого констуктору нужно передать объект appRoutes
.
var myRouter = new Marionette.AppRouter({
controller: myController,
appRoutes: {
"foo": "doFoo",
"bar/:id": "doBar"
}
});
Этот способ позволяет создать экземпляр роутера без использования
метода .extend
.
Добавление роутов при выполнения приложения
В дополнение к предварительной настройке через определение объекта appRoutes
,
роуты можно добавлять в момент выполнения приложения. Для этого нужно
воспользоваться методом appRoute()
. Этот метод работает так же, как и
метод router.route()
Backbone, но вторым аргументом в него передается
не обработчик роута, а имя метода-обработчика из контроллера.
var MyRouter = Marionette.AppRouter.extend({});
var router = new MyRouter();
router.appRoute("/foo", "fooThat");
Также при выполнении приложения с помощью метода processAppRoutes
можно
указать контроллер с несколькими роутами. Однако, в этом случае текущий
контроллер не будет изменен.
var MyRouter = Marionette.AppRouter.extend({});
var router = new MyRouter();
router.processAppRoutes(myController, {
"foo": "doFoo",
"bar/:id": "doBar"
});
Указание контроллера
Роутеры приложения могут использовать только один контроллер, который может быть указан при определении роутера:
var someController = {
someMethod: function(){ /*...*/ }
};
Marionette.AppRouter.extend({
controller: someController
});
… или в качестве параметра конструктора:
var myObj = {
someMethod: function(){ /*...*/ }
};
new MyRouter({
controller: myObj
});
К объекту, который используется как controller
, не предъявляются никакие
требования, за исключением того, что он должен содержать методы, которые были
указаны в качестве обработчиков в appRoutes
.
Рекомендуется разделять ваши контроллеры на небольшие кусочки со связанной функциональностью и иметь несколько роутеров / контроллеров вместо одного большого роутера и контроллера.
Коллбэк onRoute
Если в роутере определен коллбэк onRoute
, то он будет вызываться каждый раз,
когда пользователь совершит действие, которое изменит роут. Этот коллбэк
принимает три аргумента: имя, путь и параметры роута.