【问题标题】:Backbone, Marionette, RequireJS application startupBackbone、Marionette、RequireJS 应用启动
【发布时间】:2013-03-25 16:38:01
【问题描述】:

我正在使用 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模块:

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形成的循环依赖问题。

还有其他建议吗?

【问题讨论】:

    标签: backbone.js requirejs marionette startup bootstrapping


    【解决方案1】:

    我最近遇到了这个解决方案,在 main.js 文件中加入了 App 和 Router:

    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();
    });
    

    【讨论】:

    • 不错!这在路由器上解开了一点意大利面。不过有一件事。将 App.addRegions() 放在 App.addInitializer() 中不是更有意义吗?
    • 我想这取决于你的口味,也许它在语义上更正确,但最终你得到的效果是一样的。
    猜你喜欢
    • 2012-07-07
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多