Marionette.AppRouter

Роутер в Marionette должен быть “тонким”, то есть из него должна быть исключена любая бизнес-логика. Задача роутера сводится к вызову нужного метода контроллера, который задается при объявлении роутера.

Содержание

Объявление роутов

Для объявления роутов необходимо задать параметр 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, то он будет вызываться каждый раз, когда пользователь совершит действие, которое изменит роут. Этот коллбэк принимает три аргумента: имя, путь и параметры роута.