3

我被一个大的主干应用程序困住了。

它在主应用程序中运行不同的应用程序。我们希望将应用程序和路由异步添加到大应用程序中。

我现在要做的是在加载主应用程序后使用 Require.JS 异步添加不同的应用程序。要将新路线添加到主要路线,我会停止历史并添加新路线并重新开始历史。这可行,但它有一个主要缺点。每次我去 (app.navigate('x',true);) 时,一条新的现有路径都会触发路由,因为我有 history.started 的次数。还有所有的视图渲染。

这会大大降低应用程序的速度,并且完全低效。

有没有办法动态添加新路线而无需 history.stop/start?

4

2 回答 2

3

您不必在Backbone.history每次添加新路由时停止/启动,Backbone 会在您调用router.route或创建新路由器时修改其状态。

所以,要么手动添加路由到你的路由器:

var R = Backbone.Router.extend({
    routes: {
    }
});

var r = new R();
Backbone.history.start();

r.route('added', 'added', function() {
    console.log('added : '+window.location.hash);
});

或实例化一个新的路由器

var R = Backbone.Router.extend({
  routes: {
  }
});

var r = new R();
Backbone.history.start();

var R2 = Backbone.Router.extend({
    routes: {
        'added': 'added'
    },
    added: function() {
        console.log('added: '+window.location.hash);
    }
});
var r2 = new R2();

和一个演示

var R = Backbone.Router.extend({
  routes: {
    "help": "help"
  },
  help: function() {
      console.log('help : '+window.location.hash);
  }
});


var r = new R();
Backbone.history.start();
r.navigate('help', {trigger: true});


var R2 = Backbone.Router.extend({
  routes: {
    "r2": "r2"
  },
  r2: function() {
    console.log('r2 : '+window.location.hash);
  }
});
var r2 = new R2();
r2.navigate('r2', {trigger: true});


r.route('added', 'added', function() {
    console.log('added : '+window.location.hash);
});

r.navigate('added', {trigger: true});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

<a href='#help'>help</a>
<a href='#r2'>r2</a>
<a href='#added'>added</a>

于 2012-10-18T13:58:06.510 回答
0

我写了一个带有路由器的小 .js 文件。它应该可用于不同的目的,因此您可以在 init 上传递所需的回调(路由)。init 接受一个参数 routes (一个数组),其中包含以下信息:

routeId:"book/:id",
routeName:"routeBooks",
routeCallback: $.proxy(function(id){ 
 // $.proxy() is a jQuery function that ensures you call the callback in the right context
      // do fandy stuff here.
})

要解析路线,我使用以下内容:

for( route in routes ){
    routesFromConfig[routes[route].routeId.toString()] = routes[route].routeName;
}
var ModalRouter = Backbone.Router.extend({
    routes:routesFromConfig
});
router = new ModalRouter();
for( route in routes ){
    // test if the callback is a function
    if(_.isFunction(routes[route].routeCallback)){
        router.on('route:'+routes[route].routeName.toString(), routes[route].routeCallback);
    }
}

Backbone.history.start();

我希望这有助于从您的应用程序中其他地方传递的路由设置路由器

于 2013-07-03T23:57:13.123 回答