2014-01-23 21 views
0

我有我喜歡那裏有我的導航在初始標記(因爲SEO的)木偶地區,並享有與現有的DOM

<header id="header-region"> 
     <ul id="menu"> 
      <li>frontpage</li> 
      <li>about</li> 
      <li>contact</li> 
      <li>testing</li> 
     </ul> 
    </header> 

然後我創建了一個木偶佈局查看可用的標題區:

var MenuView = Backbone.Marionette.ItemView.extend({}); 
var menuView = new MenuView({ 
    el: '#menu' 
}); 

App.headerRegion.attachView(menuView); 

這工作完美無瑕,但是當我後來改變headerRegion內容

App.headerRegion.show(anotherView); 

,然後想切換回

App.headerRegion.show(menuView); 

它試圖渲染menuView而是因爲它沒有「模板」失敗的話,我可以以某種方式重複使用相同的視圖實例沒有原始MAINVIEW重新渲染呢?或者是「重新初始化新菜單視圖」的「Marionette方法」? (即時通訊只是好奇,如果我有一個相當複雜的觀點,需要交換出相當多,每次重新呈現的視圖可能會相當昂貴)

回答

1

當一個區域的內容被交換在Marionette之前顯示的視圖該地區將關閉;並且您通常希望避免重複使用先前已關閉的視圖。有很多綁定(event和dom組件)會導致視圖膨脹,並且您可能很難跟蹤重新使用視圖的錯誤,因爲某些綁定可能不會發生。

我碰到了幾個我的自己,像Switching views on regions loses the event bindings

+0

謝謝:)因爲我需要調換我的看法,並我喜歡我的觀點「el」在最初的HTML(用於搜索引擎優化目的),你有什麼建議我怎麼能解決我的問題?我可以想象它是一個相當常見的問題,我可以想到的一種方式是「緩存」原始DOM節點引用,並且每次我需要重新編譯時,都會執行新的MenuView({el:cachedDomNode}); –

+0

使用css而不是Regions可能會更安全,讓它們始終在dom中處於活動狀態,但使用'display:none' –

+0

+1來顯示和隱藏它們以獲得堅實的意見。 –

0

調用App.headerRegion.show(anotherView);將轉儲標題區域的內容並替換那些內容爲anotherView的內容。當您嘗試通過調用App.headerRegion.show(menuView)將該區域恢復到之前的狀態時,您所依賴的標記不再存在。

骨幹/木偶的做法是使用模板。木偶默認使用下劃線模板,所以你可以包括你的頁面上的以下內容:

<script type="text/template" id="menu"> 
    <ul> 
     <li>frontpage</li> 
     <li>about</li> 
     <li>contact</li> 
     <li>testing</li> 
    </ul> 
</script> 

,然後定義您的MenuView爲:

var menuView = new MenuView({ 
    template: '#menu' 
}); 
+0

感謝您清理視圖被替換時會發生的情況,您提到的建議會從我的頁面的最初HTML中刪除主菜單,我真的很喜歡爲搜索引擎優化的原因使用它,您有任何建議可以解決這個問題嗎? –

+0

在這種情況下,你需要在兩個地方都有。你正在使用任何種類的服務器端模板?如果是這樣,您可以將該html保存爲變量,並在頁面上插入兩次。 – giaour