2014-04-02 86 views
0

我在處理嵌套佈局期間運行一些有趣的問題。
讓我們來看看例子。一個index.html只有一個區域:Backbone.Marionette佈局和導航

... 
<div id="screen" /> 
... 

現在我有一個登錄視圖,它在這個區域上呈現。當我成功登錄時,我會呈現包含如此統計信息的主頁(在ApplicaitonLayout內)。 ApplicationLayout看起來像這樣

<div id="screen"> 
    <header /> 
    <nav id="menu" /> 
    <section id="content"/> 
    <footer /> 
</div> 

什麼,我在這裏做的是在屏幕區域呈現ApplicationLayout。這裏重要的是我希望家庭導航是可路由的。我省略了很多JS /木偶代碼,但基本上我有類似的東西(腦曼式底座)

var applicationLayout = ApplicationLayout(); 

var navigation = { 
    goHome: { 
    new MenuController({region: applicationRegion.menu}); 
    new HomeController({region: applicationRegion.content}); 
    } 

} 
app.screen.show(applicaitonLayout); 
new HomeRoute(controller: navigation); 

因此,我在這裏做的是我總是需要渲染,即使我不需要該菜單例如有人點擊不同的菜單選項,只有applicationRegion.content應該被重新渲染。 當更改導航時,如何處理部分靜態的區域(總是會顯示登錄菜單後)以更一般地進行處理?

編輯:

所以,問題是:如果我需要經常呈現在導航菜單的每一個變化的菜單,甚至這個菜單已經存在?
更具體地講,我們有2種方法來達到主頁:
- 從瀏覽器的第一個途徑,在此我們想使整個網頁(包括菜單)
- 第二導航從菜單項,在這種情況下,我們不應該需要呈現菜單,因爲它應該已經存在。

回答

1

爲此目的,使用一個應用程序區域:https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.region.md

你的菜單將被顯示在一個區域中,和主要內容(其可以包含的佈局)。將在另一個區域。

你可以看到一個例子(從我book on marionette)位置:https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/app.js#L3

而一個活生生的例子在這裏:http://davidsulc.github.io/marionette-gentle-introduction/#contacts

編輯基於評論:

如果你的佈局已經呈現(並因此菜單是可見的),當點擊一個菜單項時你只需要改變佈局的子視圖:myLayout.show(newView)

的通信可以通過reqres處理,例如見https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/header/list/list_controller.js#L11(事件觸發)和https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/contacts_app.js#L27(事件處理程序)

+0

大衛你的建議,使菜單的應用區域。我不想那樣做。我的應用程序區域只是#屏幕,並在此區域添加包含菜單的ApplicationLayout。當我將菜單導航從家庭切換到配置文件時,如何處理用例,而不是始終呈現菜單區域? – user1297783

+0

我不想菜單是一個應用程序區域,因爲這意味着它將從應用程序的開始在網站上。我希望菜單是ApplicationLayout的一部分,在用戶成功驗證後顯示。也許我錯過了一些概念,或者我在架構級別做錯了什麼? – user1297783

+0

然後,你需要做的是當一個使用單擊一個菜單選項,你創建一個新的視圖,並在佈局區域顯示它。這就是全部...... –