Маршруты и контроллеры в 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, но он не работает.

Другие вопросы по тегам