具有多个入口点的木偶应用

时间:2013-12-12 15:28:51

标签: javascript node.js backbone.js marionette

目前我正在构建的应用程序是具有单个入口点的单页木偶应用程序。当用户在“/”时,我传递了一个非常简单的玉文档:

 body

    header

    section
        div#main

script(src='/javascripts/lib/require.js', data-main='/javascripts/application.js')

我正在加载的唯一一个javascript是我的require.js页面,一旦加载了我就开始使用Backbone.Marionette.Application(),这就是我为整个应用程序创建的唯一应用程序对象,它可以处理所有内容。

define([
  'zepto', 'marionette', 'router', 'events'],
function ($, Marionette, router, Event) {
    // set up the app instance
    var MyApp = new Backbone.Marionette.Application();

    MyApp.addRegions({
      main: "#main"
    });

    MyApp.addInitializer(function(){

    });

    MyApp.on("initialize:after", function(){
        var newRouter = new router(MyApp);
        Backbone.history.start();
    });

    MyApp.start();
    return MyApp;

});

如果我有多个入口点(换句话说,在服务器端创建了多个html页面),例如一个用于“课堂”,一个用于“用户档案”,一个用于“讨论”,这是否意味着我需要单独的要求.js文档加载每个页面和单独的Backbone.Marionette.Application()对象?

1 个答案:

答案 0 :(得分:1)

你没有其他方面它太麻烦:)这是Route的工作。

首先,不要立即在应用定义中启动应用。删除此行

MyApp.start();

然后,将这样的命令放在你的html页面的页脚上,并且在dom ready之后更好

$(function(){
  MyApp.start();
});

第三是最重要的。您需要在App或子应用程序中定义您的路线(更好)。这是从BBCloneMail“借来”的代码

BBCloneMail.module("ContactApp", {
  startWithParent: false,
  define: function (ContactApp, App, Backbone, Marionette, $, _) {

    var Router = Marionette.AppRouter.extend({
      before: function() {
        App.startSubApp("ContactApp", {});
      },

      appRoutes: {
        "contacts": "showContacts"
      }
    });

在上述情况下,当访问者从example.com/contacts进入您的应用时,方法showContacts将被触发,这是您安排页面特定逻辑的开始。

有关appRouter的更多信息: https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.approuter.md