Маршруты и контроллеры в Marionette.js
Я новый Marionette.js. Я в настоящее время внедряю маршруты и контроллеры. В моем App.js у меня есть:
App.appRouter = new Router({
controller:new AppController()
});
Я хочу, чтобы AppController инициализировал другие контроллеры. Итак, у меня есть GenericController, который следит за всем, когда изменение хеша является "общим", NewsController, который следит за всем, когда хэш меняется на "новости" и т. Д. Я не хочу, чтобы все функции маршрута были в одном файле гигантского контроллера. Итак, мой AppController выглядит так:
define(['App', 'backbone', 'marionette',
"app/models/generic", "app/views/GenericList",
'app/utils/useful_func', 'app/utils/pageslider',
'constants',
'app/controllers/GenericController'
],
function (App, Backbone, Marionette,
model, GenericList,
Useful, PageSlider,
constants,
GenericController) {
return Backbone.Marionette.Controller.extend({
initialize:function (options) {
genericController = new GenericController();
},
});
});
GenericController выглядит так:
define(['App', 'backbone', 'marionette'],
function (App, Backbone, Marionette) {
return Backbone.Marionette.Controller.extend({
initialize:function (options) {
},
getGeneric: function(){
console.log('in getGeneric');
},
});
});
Маршрутизатор выглядит так:
appRoutes: {
"generic": "getGeneric",
...
Тем не менее, я в конечном итоге с ошибкой:
Method 'getGenericItem' was not found on the controller
Потому что это просто поиск в AppController, а не GenericController для функций маршрутизатора.
Если я переместить getGenericItem() в основной AppController, он работает нормально. Как я могу заставить его искать в GenericController функции маршрутизатора?
1 ответ
Рекомендуется разделить объекты контроллера на более мелкие части связанных функций и иметь несколько маршрутизаторов / контроллеров вместо одного гигантского маршрутизатора и контроллера.
Так что сделайте это:
var AppController = Backbone.Marionette.Controller.extend({
initialize:function (options) {
},
customAction: function() {
console.log('in customAction');
}
});
var GenericController = Backbone.Marionette.Controller.extend({
initialize:function (options) {
},
getGeneric: function(){
console.log('in getGeneric');
}
});
App.appRouter = new Marionette.AppRouter({
controller:new AppController(),
appRoutes: {
"custom": "customAction"
}
});
App.genericRouter = new Marionette.AppRouter({
controller: new GenericController(),
appRoutes: {
"generic": "getGeneric"
}
});
Вот jsbin, но он не работает.