Backbone.js 具有现有dom的木偶区域和视图

Backbone.js 具有现有dom的木偶区域和视图,backbone.js,marionette,Backbone.js,Marionette,我有一个标题区域,我希望在初始标记中可以使用我的导航(因为SEO) 这是完美的,但当我以后更改headerRegion内容时 App.headerRegion.show(anotherView); 然后想使用 App.headerRegion.show(menuView); 它尝试渲染menuView,但由于它没有“模板”,因此失败,我是否可以在不重新渲染的情况下重用同一视图实例?或者是“木偶方式”来重新初始化一个新的menuView?(我只是好奇,如果我有一个相当复杂的视图,需要经常交换,

我有一个标题区域,我希望在初始标记中可以使用我的导航(因为SEO)

这是完美的,但当我以后更改headerRegion内容时

App.headerRegion.show(anotherView);
然后想使用

App.headerRegion.show(menuView);

它尝试渲染menuView,但由于它没有“模板”,因此失败,我是否可以在不重新渲染的情况下重用同一视图实例?或者是“木偶方式”来重新初始化一个新的menuView?(我只是好奇,如果我有一个相当复杂的视图,需要经常交换,每次重新渲染视图可能会非常昂贵)

当一个区域的内容在木偶中交换时,该区域中显示的上一个视图将被关闭;您通常希望避免重用以前关闭的视图。有相当多的绑定(事件和dom组件)会导致视图膨胀,如果重新使用视图,可能会导致难以跟踪错误,因为其中一些绑定可能不会发生


我遇到了一些像我自己的人

调用
App.headerRegion.show(另一个视图)
将转储标题区域的内容,并将其替换为另一个视图的内容。当您尝试通过调用
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>

谢谢:)因为我需要交换我的视图,我喜欢我的视图“el”在初始HTML中(用于SEO目的),你对我如何解决我的问题有什么建议吗?我可以想象这是一个非常常见的问题,我可以想到的一种方法是“缓存”原始DOM节点引用,并且每次需要重建时都执行新的MenuView({el:cachedDomNode});使用css而不是区域可能更安全,让它们在dom中始终处于活动状态,但使用
display:none
显示和隐藏它们。感谢您清除了视图被替换时发生的情况,您提到的建议将主菜单从我页面的初始HTML中删除,出于SEO原因,我非常喜欢使用它,你有什么建议来解决这个问题吗?如果是这样的话,你需要在两个地方都有。您是否使用任何类型的服务器端模板?如果是这样,您可以将该html另存为变量,并在页面上插入两次。
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>
var menuView = new MenuView({
    template: '#menu'
});