Backbone, Marionette, запуск приложения RequireJS

Я создаю приложение с Backbone, Marionette и RequireJS, и я хотел бы, чтобы его запускали более опытные люди, если запуск приложения можно каким-либо образом улучшить/улучшить.

Структура папки:

index.html
js/
  collections/
  libs/
    backbone.js
    marionette.js
    require.js
    ...
  models/
  views/
  app.js
  init.js
  router.js

В настоящее время начальная загрузка приложения выглядит следующим образом.

index.html определяет точку входа requireJS как:

<script data-main="js/init" src="js/libs/require.js"></script>

init.js выполняет настройку RequireJS и:

require(['app'], function(App){
    App.start();
});

Модуль приложения в app.js:

App = new Backbone.Marionette.Application();

App.addInitializer(function (options) {
  // initialize the Router; will only setup the routes and corresponding callbacks; not history.start()
  App.router = new Router();
  // initialize Marionette regions
  App.addRegions({
    'header': '#header',
    'main': '#main',
    'footer': '#footer'
  });
});

App.on('start', function(options) {
  Backbone.history && Backbone.history.start() || console.error('No "Backbone.history" to .start()');
});

return App;

Модуль маршрутизатора в router.js:

return Backbone.Router.extend({
    routes: {      
      'panel/:handle': 'showPanel',
    },

    showPanel: function (handle) {
      require(['app'], function (App) {
        App.main.show(new Panel_v({userHandle: handle}));
      });  
    }      
});

Есть ли способ сделать модуль маршрутизатора менее запутанным? Я разработал этот способ для решения проблемы циклической зависимости, образованной App-> Router-> App.

Любые другие предложения?


person Thalis K.    schedule 25.03.2013    source источник


Ответы (1)


Недавно я пришел к этому решению, объединив приложение и маршрутизатор в файле main.js:

App.js

define(['marionette'], function(Marionette) {
  var App;
  App = new Backbone.Marionette.Application();
  App.vars = {};
  App.addRegions({
    headerRegion: "#header-region",
    mainRegion: "#main-region",
    footerRegion: "#footer-region",
    dialogsRegion: "#dialogs"
  });
  App.vent.on("routing:started", function() {
    Backbone.history.start();
  });
  return App;
});

Router.js

    define(['marionette', 'app'], function(Marionette, App) {
      var appRouter, routerController;
      routerController = {
        showViaggi: function() {
          return require(['modules/viaggi/viaggi'], function(Viaggi) {
            App.Modules.viaggi = new Viaggi();
            return App.Modules.viaggi.start();
          });
        }
      };
      return appRouter = Backbone.Marionette.AppRouter.extend({
        appRoutes: {
          'viaggi': 'showViaggi'
        },
        controller: routerController
      });
    });

И Main.js, мой первоначальный скрипт, загруженный Require.js

define(['app', 'routers/appRouter'], function(App,appRouter) {
  App.addInitializer(function() {
    App.Router = new appRouter;
    return App.vent.trigger("routing:started");
  });
  return App.start();
});
person Ingro    schedule 25.03.2013
comment
Ницца! Это немного распутывает спагетти на маршрутизаторе. Однако есть одна вещь. Разве не имеет смысла размещать App.addRegions() внутри App.addInitializer()? - person Thalis K.; 26.03.2013
comment
Я полагаю, это на ваш вкус, может быть, это более правильно семантически, но в итоге эффект, который вы получаете, тот же. - person Ingro; 26.03.2013