2012-12-07 110 views
1

我正在使用Backbone构建单个网页应用程序,而且我正面临一个问题: 我的主视图取决于将根据URL替换我的页面的正文部分的模板,但由于我必须提供一个“el “对于这个观点,我希望它成为模板本身,它将被插入DOM中的”渲染“或”初始化“方法。使用el尚未创建的主干?

但是当我调用新的MyMasterView时,el是未定义的,因为它不存在于实例化的DOM中。

我该怎么办?

我发现的唯一修复方法是将el设置为现有的DOM,替换内容并在渲染中调用.remove()。append(the_template),但我不确定这是否是最好的方法。

感谢您的帮助。

+0

你有任何示例代码? – jcreamer898

回答

3

我们可以考虑在这里你有以下的div的DOM

<div id="existing"> 

</div> 

这个div可以,你想插入一张视图生成的HTML的任何其他元素的场景。

假设你下面的模板,

<div id="inside_template"> 
    <!-- content of the template goes here --> 
</div> 

可以指定existingel的观点作为其已经存在于股利。唯一的问题是,如果它的某个标签像body或某些东西,那么如果您在清除视图时将其从视图中移除(以防止内存泄漏),它将从dom中删除可能不需要的标记。

的解决方案可能是,指定existingel,渲染视图的HTML在el和呼叫setElement后附加模板HTML到像DOM之后,

render : function() { 
    this.$el.html(this.template()); 
    this.setElement("#inside_template"); 

    // another render method content 
} 

这将完成是,它会将更改为从existing(或任何其他DOM元素)到inside_template的视图。因此,在删除el时,inside_template元素将被删除,并保留existing元素,因为它在DOM中。

+0

多棒!我不知道setElement!谢谢! :) –

+0

很高兴它帮助:) – Cyclone

0

您是否尝试过将el设为空并仅设置tagName?如果你这样做,_ensureElement将为你的视图元素创建一个新的分离DOM节点。您应该能够呈现从页面的DOM分离的DOM片段,然后外部代码可以使用append或者类似jQuery的replaceWith这样的元素。