ProcessAppRoutes для Maionette AppRouter не является функцией

В моем приложении у меня есть глобальный триггер, который вызывает navigate по маршрутизатору, он в основном позволяет мне писать обычные ссылки и запускать методы маршрутизации магистрали.

Во всяком случае, я пытаюсь разбить свои маршрутизаторы на более мелкие объекты маршрутизатора, а затем объединить их в один основной маршрутизатор, на котором я могу запустить метод navigate не зная, с каким суб-маршрутизатором я пытаюсь поговорить.

Я создал несколько контроллеров и я пытаюсь передать их в моем AppRouter объекта, используя processAppRoutes метод, описанный здесь, но я получаю сообщение, что это не функция. Я проверил, что мои версии обновлены, и я вижу определение метода в исходном коде, но я не могу назвать его.

Я использую requirejs, поэтому я опубликую пример того, как я структурировал свою попытку, сокращенную до соответствующих частей для краткости.

users.controller.js:

return Marionette.Controller.extend({
 routes: {
 'users/login': 'login'
 },

 login: function(){
 ...
 }
});

routes.js:

var UsersController = require('users.controller');

var router = new Marionette.AppRouter.extend();
router.processAppRoutes(UsersController, UsersController.routes);

Я включил маршруты как объект контроллера, чтобы сделать их доступными при возврате контроллера с помощью requirejs, так что почему это там.

В основном, мой вопрос заключается в следующем: как определить маршрутизаторы как отдельные объекты, а затем объединить их в один маршрутизатор для всего приложения?

1 ответ

Вот что я в итоге сделал:

routes/routes.js: (Возвращает объект AppRouter, который затем может быть запущен как единственный AppRouter в приложении Marionette)

var Controllers = {
 Events: require('events/events.controller'),
 Users: require('users/users.controller')
};

var routes = {};
var MyAppController = {};
$.each(Controllers, function(key, controller){
 var c = new controller();
 routes = _.extend(routes, c.routes);
 MyAppController = _.extend(MyAppController, c);
});

var MyAppRouter = Marionette.AppRouter.extend({
 controller: MyAppController,
 appRoutes: routes 
});
return MyAppRouter;

events/events.controller.js: (всего лишь фрагмент)

var EventsController = Marionette.Controller.extend({
 routes: {
 '': 'showEvents',
 'events/add': 'addEvents'
 },

 showEvents: function(){ ... },
 addEvents: function(){ ... }
});

Оказывается, я мог запускать processAppRoutes() в AppRouter только до того, как он был создан с new, и только один раз. Определив объект маршрута внутри контроллера, который не используется контроллером, я могу получить к нему доступ в файле routes.js выполнить итерацию маршрутов и методов для создания объекта AppRouter со всеми маршрутами для всего приложения. Добавление нового контроллера так же просто, как и требование его внутри объекта Controllers.

licensed under cc by-sa 3.0 with attribution.