underscore.js嵌套模板

是否有可能以某种方式从下划线模板中获取DOM元素并将其用作另一个模板?

这个想法是,我的应用程序需要渲染一个包含项目和摘要循环的文档。 我需要偶尔重新渲染只是摘要或几个项目,所以我不能只重新渲染整个文档。

但是,我想让应用程序用户为文档创建自己的模板很简单,我认为将所有内容保存在一个文档中可以使文档更容易。

我试图使用这样的东西:

<script type="text/template" id="document-template">
    <div id="document">
        <h1><%= name %></h1>
        <ul class="items">
            <% _.each(items, function(item) { %> 
                <li><%= item %></li>
            <% }); %>
        </ul>
        <div id="summary">
            <p>Total items: <%= totalitems %></p>
        </div>
    </div>
</script>

现在,我可以很容易地做这个var documentTemplate = _.template($('#document-template').html()); 将其转换为文档模板,但我想将摘要部分转换为模板,并将列表项转换为模板。

我可以做这样的事情吗?

var summaryTemplate = _.template($('#document-template #summary').html());
var itemTemplate = _.template($('#document-template .items li').html());

PS。 实际上,我使用jQuery的$ .get从外部文件加载模板。 这样我就可以将文档模板放在一个大字符串中。 从那里,我可以做documentTemplate = _.template(loadedString);

现在,如果我只能从字符串中提取#summary元素,它应该可以工作。 但是,当我尝试将字符串转换为DOM元素( var domElement = $(loadedString) )(所以我可以这样做: summaryTemplate = _.template($('#summary',domElement).html());将不起作用,因为下划线不会再识别<%=%>标签。


您可以将嵌套模板作为模板赋值中的变量传递给主模板,例如:

HTML:

<script type="text/template" id="sub_template">
  <article>
    <h1>id: <%= id %><h1>
  </article>
</script>

<script type="text/template" id="main_template">
  <% for (var i = 0; i < num; i++) { %>
    <%= renderSub({id:i}) %>
  <% } %>
</script>

JS:

 var renderSub = _.template( $('#sub_template').remove().text() ),
     renderMain = _.template( $('#main_template').remove().text() );

  renderMain({num:5, renderSub:renderSub});

操场

/////// TEMPLATES //////

    var mainTemplate = "<ul> 
                          <% _.each(items, function(item) { %> 
                               <%= listItem({item:item}) %> 
                          <% }); %> 
                        <ul>";

    var subTemplate = '<li><%=item %></li>';


/////// MODEL (our data) //////

    var model = {
        items : [1,2,3,4,5]
    }


/////// COMPILE //////

    // add the subTemplate to the model data, to be passed to the mainTemplate
    model.listItem = _.template(subTemplate);

    // Render main template to the DOM
    document.body.innerHTML = _.template(mainTemplate, model);

而不是一次加载一个模板作为一个模板,然后尝试再次加载一部分,将它们分隔为多个模板。

拥有主文档模板和摘要模板。 初始负载拉入文档模板,然后拉入摘要模板并从第一个模板插入到编译的DOM中。 然后您可以随时重新加载第二个模板。 请参阅以下步骤:

1)加载初始模板,如下所示:

<script type="text/template" id="document-template">
    <div id="document">
        <h1><%= name %></h1>
        <ul class="items">
            <% _.each(items, function(item) { %> 
                <li><%= item %></li>
            <% }); %>
        </ul>
    </div>
</script>

2)将其编译到DOM后,通过下划线加载第二个模板,如下所示:

<script type="text/template" id="summary-template">
    <div id="summary">
        <p>Total items: <%= totalitems %></p>
    </div>
</script>

3)调用$(“#document”)。append(summaryTemplate)或任何变量持有已编译模板。

4)无论何时需要重新加载摘要,重复步骤2和步骤3,除了首先删除现有的$(“#summary”)之后再次追加

您也可以对这些项目使用相同的策略,只要确保使用正确的jQuery选择器/方法,以便以正确的顺序覆盖现有的div,因为append只能用于将某些内容添加到元件。

链接地址: http://www.djcxy.com/p/72069.html

上一篇: underscore.js nested templates

下一篇: How to use if statements in underscore.js templates?