2014-01-20 43 views
0

我有一个非常简单的主菜单,有4个锚点和相关的视图。无论如何,在其中的一个意见中,我想添加一个带有3个选项卡的子菜单,点击它们后,它们会显示不同的视图。我想通过pushState:false怎么做,但我想要的是一个干净的URL。现在,我的网址看起来像http://localhost/myproject/#secondpage/subview1http://localhost/myproject/#secondpage/subview2等等。所以有人知道我怎么做http://localhost/secondpage无论哪个子视图/标签被触发?BackboneJS - 子视图导航

进出口使用RequireJS和HandlebarsJS(对于HTML的模板)

所以现在我的代码(片段)是这样的:

Router.js

routes: { 
'': 'index', 
'firstpage' : 'firstpage', 
'secondpage' : 'secondpage', 
'secondpage/sub1' : 'sub1', 
'secondpage/sub2' : 'sub2', 
'secondpage/sub3' : 'sub3', 
'thirdpage' : 'thirdpage' 
}, 

Backbone.history.start({ 
    pushState: false 
}); 

我与锚HTML :

<ul> 
<li> 
    <a class="sub1" href="#secondpage/sub1">Bands</a> 
</li> 
<li> 
    <a class="sub2" href="#secondpage/sub2">Koncert</a> 
</li> 
<li> 
    <a class="sub3" href="#secondpage/sub3">Locations</a> 
</li> 
</ul> 

和我的看起来像

define(['backbone','handlebars', 'text!templates/SubMenu.html'], 

    function(Backbone,Handlebars, Template) { 


     'use strict'; 

     var SubMenuView = Backbone.View.extend({ 

      template: Handlebars.compile(Template), 

      initialize: function() { 
       _.bindAll(this); 
      }, 

      render: function() { 
       $(this.el).html(this.template()); 
       return this; 
      } 

     }); 

     return SubMenuView; 


    } 
); 

另一件事是:我应该通过设置事件将动作移动到视图?我有点试过,但是因为视图是在路由器中定义它没有工作......

我想什么是设置pushState:true,然后我删除了secondpage/sub1一样的东西在我的路由器,那么在我看来,我写道:

events: { 
'click a.sub1': 'sub1', 
}, 

sub1: function(event) { 
    event.preventDefault(); 
    var sub1Router = new Backbone.Router(); 
    var route = '/secondpage/'; 
    sub1Router.navigate(route, {trigger: true}); 
}, 

,但没有工作,这给了我找不到网址所以...

欢迎任何帮助!在此先感谢...

[更新] 好了,按要求,这里是我的(新)路由器:

var Router = Backbone.Router.extend({ 

routes: { 
    '': 'index', 
    'firstpage' : 'firstpage', 
    'secondpage' : 'secondpage', 
    'thirdpage' : 'thirdpage' 
}, 

initialize: function() { 
    var self = this; 

    //Views 
    this.mainMenuView = new MainMenuView({el:'#mainMenu'}).render(); 
    this.subMenuView = new SubMenuView(); 

    Backbone.history.start({ 
     pushState: true 
    }); 

}, 

index: function() { 
    var self = this; 
}, 

firstpage: function() { 
    this.firstpageView = new FirstpageView({el:'#topContent'}).render(); 
}, 

secondpage: function() { 
    this.secondpageView = new SecondpageView({el:'#topContent'}).render(); 
    this.subMenuView = new SubMenuView({el:'#subMenu'}).render(); 
}, 

thirdpage: function() { 
    var thirdpageView = new ThirdpageView({ el:'#topContent', collection:this.categoryCollection}).render(); 
}, 

sub1: function() { 
    this.sub1View = new Sub1View({el:'#subContent_2'}).render(); 
}, 

sub2: function() { 
    this.sub2View = new Sub2View({el:'#subContent_2'}).render(); 
}, 

sub3: function() { 
    this.sub3View = new Sub3View({el:'#subContent_2'}).render(); 
}      


}); 

return Router; 
} 

我的(新)查看样子:

var SubMenuView = Backbone.View.extend({ 

template: Handlebars.compile(Template), 

events: { 
'click .sub1': 'sub1', 
'click .sub2': 'sub2', 
'click .sub3': 'sub3', 

}, 

sub1: function(event) { 
    var sub1Router = new Backbone.Router(); 
    var route = '/secondpage'; 
    sub1Router.navigate(route, {trigger: true}); 
}, 

sub2: function(event) { 
    event.preventDefault(); 
    var sub2Router = new Backbone.Router(); 
    var route = '/secondpage'; 
    sub2Router.navigate(route, {trigger: true}); 
}, 

sub3: function(event) { 
    event.preventDefault(); 
    var sub3Router = new Backbone.Router(); 
    var route = '/secondpage'; 
    sub3Router.navigate(route, {trigger: true}); 
},    

initialize: function() { 
    _.bindAll(this); 
}, 

render: function() { 
    $(this.el).html(this.template()); 
    return this; 
} 

}); 

return SubMenuView; 

我的(新)HTML模板:

<ul> 
<li> 
    <a class="sub1" href="/secondpage/">Sub1</a> 
</li> 
<li> 
    <a class="sub2" href="/secondpage/">Sub2</a> 
</li> 
<li> 
    <a class="sub3" href="/secondpage/">Sub3</a> 
</li> 
</ul> 

希望ŧ他可以贡献更多的输入/建议...这真是让我疯了,这让我考虑使用.show()和.hide()jquery方法,即使我真的不想要...

回答

0

你是什么描述骨干路由是如何工作的,无论是使用'/ secondpage/sub1'并使用服务器路由,还是使用'#secondpage/sub1'命中主干路由。无论哪种方式,地址栏将使用您的URL进行更新。

另一种选择是在视图中使用事件,处理点击事件并相应地更新视图的模板。

但是,如果您打算使用路线,那么也许看看clickify.js。我还没有用过它,尽管我已经将它加入了书签以备将来使用......听起来它可能会做你想要的。

+0

嗯,也许我不是很清楚。我宁愿避免使用一些脚本来实现这种功能,这可能应该可以以明确的主干方式完成...... – SHT

0

尝试在你的路由器使用这样的:所有的工作就完成了

Backbone.history.navigate('secondpage'); 

后(该模型获取的观点被渲染)

+0

这仍然会更新网址吗?除非将触发选项设置为真,否则不会触及路线,例如Backbone.history.navigate('secondpage',true); –

+0

我认为这就是SHT所要求的。 –

+0

也许他是,也许还不清楚......但他的问题始于'点击它们后显示不同的视图'和Backbone.history.navigate而没有将触发器设置为true,并且pushState:false将不会(在它是自己的)加载视图,只需更新网址。 –