2014-01-20 3 views
0

저는 4 개의 앵커가있는 매우 간단한 메인 메뉴와 관련보기가 있습니다. 아무튼 그보기 중 하나에서 3 개의 탭이있는 작은 하위 메뉴를 추가하고 싶습니다. 탭을 클릭하면 다른보기가 표시됩니다. 내가 pushState:false와 함께 그것을하는 방법을 이해했다. 그러나 내가 원하는 것은 깨끗한 URL 다. 지금 당장 내 URL은 http://localhost/myproject/#secondpage/subview1 또는 http://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> 

내보기는

01입니다.
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; 


    } 
); 

또 다른 사항은 다음과 같습니다. 이벤트를 설정하여보기로 작업을 이동해야합니까? 나는 내가 쓴 내보기에 그 다음, 내 라우터에 secondpage/sub1 thingies를 제거한 다음, 내가 노력 무엇

pushState:true을 설정하는 것입니다 ... 나는 종류의 시도했지만 뷰가 라우터에 정의되어 있기 때문에이 일을 일부러 :

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

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

하지만 나에게 URL을 준 didnt 한 일이,를 찾을 수 없습니다 그래서 ...

어떤 도움을 환영합니다! 미리 감사드립니다 ...

[업데이트] 확인 요청에 의해, 그래서 여기 내 (신규) 라우터 :

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> 

희망 t 그의 당신이있어 무엇

답변

0

... 이것은 정말 나에게 내가 정말 해달라고 원하는 경우에도 (.show 사용) 및 .hide() JQuery와 방법을 고려하게 미치게됩니다 ... 더 입력/제안에 기여할 수 설명은 백본 라우팅이 작동하는 방식으로 '/ secondpage/sub1'을 사용하고 서버 경로를 사용하거나 '# secondpage/sub1'을 사용하고 백본 라우팅을 사용합니다. 어느 쪽이든 주소창은 URL로 업데이트됩니다.

하나의 대안 옵션은 클릭 이벤트를 처리하고 그에 따라 뷰의 템플릿을 업데이트 뷰 내부 이벤트를 사용하는 것입니다.

그러나 경로를 사용하려는 경우 clickify.js을 살펴 보시기 바랍니다. 나는 잠재적 인 장래의 사용을 위해 북마크 해 두었지 만, 당신이 원하는 것을 할 수있는 것처럼 들린다.

+0

흠 어쩌면 내가 충분히 명확 않네 ​​(모델은 뷰가 렌더링 페치된다). 차라리 명확한 백본 방식으로 수행되어야하는 그런 기능을 위해 스크립트를 사용하는 것을 피할 것입니다 ... – SHT

0

는 라우터에서 이것을 사용하려고 : 모든 작업이 완료

Backbone.history.navigate('secondpage'); 

+0

그건 여전히 URL을 업데이트합니까? 또한 트리거 옵션을 true로 설정하지 않으면 경로를 공격하지 않습니다. Backbone.history.navigate ('secondpage', true); –

+0

나는 그것이 SHT가 요구하는 것이라고 생각한다. –

+0

어쩌면 그는 아마도 분명하지 않을지 모르지만 그의 질문은 '클릭 한 후 다른보기를 표시합니다.'및 Backbone.history. 트리거가 true로 설정된 상태에서 탐색하고 pushState : false는 그것은 자신의)보기를로드, 그냥 URL을 업데이 트하십시오. –