如何使用backbone和requirejs定义/使用多个路由

时间:2012-06-17 09:50:06

标签: backbone.js routing requirejs marionette backbone-routing

我将我的应用分成几个应用。

main.js
app.js
app1/
  |- routing
  |- controller
  |- app
app2/
  |- routing
  |- controller
  |- app

1)当我尝试使用app1中的路由器时,它们可以工作 2)当我尝试使用app2中的路由器时,它们不起作用 3)如果我对'js/app1/routing',中的main.js行评论app2中的路由器。

为什么会出现这种情况?
是否有一些应用程序在github上使用多个路由和requirejs的例子?

感谢。

这是我的代码:


** main.js **

define([
    'js/app',
    'js/app1/routing', // the routers in this app work
    'js/app2/routing'  // the routers in this app do not work but 
                       // if I comment the previous line (js/app1/routing',) 
                       // they works
],
function (App)
{
    "use strict";
    App.initialize();
});

** app.js **

define([],
function ()
{
    "use strict";
    var app = new Backbone.Marionette.Application();

    return app;
});

** app1 / rotuing **

define(['backbone','app1/controller'], function(Backbone, controller)
{
    "use strict";
    var Router = Backbone.Marionette.AppRouter.extend({

        appRoutes: {
            '*defaults': 'index1'
        }

    });
    return new Router({
        controller: controller
    });

});

** app2 / routing.js **

define(['backbone','app2/controller'], function(Backbone, controller)
{
    "use strict";
    var Router = Backbone.Marionette.AppRouter.extend({

        appRoutes: {
            'app2': 'index2'
        }

    });
    return new Router({
        controller: controller
    });

});

1 个答案:

答案 0 :(得分:5)

问题可能是由加载路由器文件的顺序以及路由器的创建引起的。

Backbone的history对象负责执行路由。它会在路由器实例化时收集所有路由器上定义的所有路由。然后它监视浏览器的URL以进行更改。当它看到一个变化时,它将采用第一个可用的匹配路线并触发一条路线,跳过其他任何路线。

如果您定义了*defaults路线,那么一切都符合此要求。因此,如果首先加载此路由,则不会发生任何其他路由。因此,您需要在路由参数中更明确,以便这一条路线不会一直打到,或者您需要确保最后加载此路由器。