Backbone Subrouter到特定视图

时间:2015-01-29 11:16:19

标签: javascript jquery backbone.js

是否可以将子路由器添加到特定视图?让我们说我有一个适用于多辆汽车的Backbone应用程序。现在,我的路由器看起来像这样

carRouter = Backbone.Router.extend({
   routes: {
      '': 'index'
      'contact' : 'contact'
      ':car': 'car',
      ':car/gallery' : 'cargallery',
      ':car/specs' : 'specs',
      ':car/infos' : 'infos',
      'about: 'aboutPage'
    }

    car: function(){
       // do this
    },
    cargallery: function(){
       // do this
    },
    specs: function(){
       // do this
    },
    infos: function(){
       // do this
    }
    ...etc

});

这种方法,显然会使整个页面呈现,我基本上想要避免。例如,当我点击“gallery”和“specs”来回时,整个页面会在每次点击时重新渲染。

那么,是否可以做类似的事情:

routes: {
      'contact' : 'contact'
      ':car': 'car',
      'about: 'aboutPage'
      },

     car: function(){
         // new router containing
         // ':car/gallery' : 'cargallery',
         // ':car/specs' : 'specs',
         // ':car/infos' : 'infos',
     },
  }

然后,在Car页面上,我会在菜单(图库,规格,信息)中有3个标签,它们会加载特定汽车的型号/集合,而不会重新渲染页面?

感谢任何帮助/建议!

1 个答案:

答案 0 :(得分:0)

您可以使用事件,Backbone触发器和自定义EventHandler对象完成此操作。

CarView中的事件哈希:

events : {
    "click .spec" : "showSpecs",
    "click .gallery" : "showGallery",
    "click .info" : "showInfo",
},

//Invoked when you click the show specs tab.
showSpecs : function(event) {
//Say that EventBus is your custom event handler
    event.preventDefault();
    MyApp.EventBus.trigger("show:spec",payload); 
},
showGallery : function(event) {
    event.preventDefault();
    MyApp.EventBus.trigger("show:gallery",payload); 
}
....

在MyApp.EventBus中:

_.extend(MyApp.EventBus,Backbone.Events);  

MyApp.EventBus.showGallery = function(payload) {
  // payload is an optional data that you can get from the triggered view
  // Fetch your models or collection
  // Instantiate the corresponding view and pass your data(models/collections) to it.
  // Update the url to reflect the new view so that if you hit refresh you
  // come to the same tab.
  MyApp.router.navigate("/your-url",{trigger:false});
}
MyApp.EventBus.on("show:gallery",showGallery);

还在路由器中添加一个方法,可以处理选项卡的刷新。