【问题标题】:Handlebars.js: Use a partial like it was a normal, full templateHandlebars.js:像使用普通的完整模板一样使用部分模板
【发布时间】:2013-08-20 19:29:16
【问题描述】:

我有一个模板,我既想将其用作部分模板,也想单独从 javascript 中使用。

【问题讨论】:

    标签: javascript jquery templates handlebars.js


    【解决方案1】:

    如果您的模板是预编译的,您可以通过Handlebars.partials['partial-name']() 访问您的部分,也可以通过{{> partial}} 帮助程序从模板中调用它们。

    这很好,因为您可以编写一个实用函数来渲染模板,无论它是完整模板还是部分模板。

    例如:

    function elementFromTemplate(template, context) {
        context = context || {};
        var temp = document.createElement('div');
        temp.innerHTML = templates[template] ? templates[template](context) : Handlebars.partials[template](context);
        return temp.firstChild;
    }
    

    myDiv.appendChild(elementFromTemplate('myPartial', context));

    myDiv.appendChild(elementFromTemplate('a-whole-template'));

    希望这可以帮助其他想像我一样使用 Handlebars 的人。

    【讨论】:

    • Handlebars.partials[ 'partial-name' ] 虽然不返回函数,但它返回模板(字符串)。感谢您指出这一点。
    • @mynameistechno 可能是因为你没有预编译你的模板(就像你应该做的那样!)
    • 如果部分包含像tr 这样的表格元素,这将不起作用。 innerHTML 不会将表格元素解析到临时 div 中。
    【解决方案2】:

    反过来更容易——将所有模板编译为普通模板,然后将它们作为部分模板使用:

    Handlebars.partials = Handlebars.templates
    

    这使得您可以像往常一样使用您的模板,也可以作为部分模板使用:

    {{> normalTemplate}}
    

    【讨论】:

    • 有趣的想法。是否有缺点或原因您想要不是普通模板的部分? (如果没有,Handlebars 似乎可以只使用 {{> xxx}} 语法来表示包含另一个模板,而根本没有部分概念?)
    • 正是我的想法。我不理解 partials 的概念,还没有找到使用它们的充分理由。我想这是一个约定俗成的事情?或者某种优化......如果您(并且您应该)预编译模板,这并不重要。我可能遗漏了一些东西,但至少通过预编译,这种方法似乎是安全的。
    • 真正有趣的“hack”,对预编译的模板非常有用!
    【解决方案3】:

    要从 javascript 渲染部分内容,您可以使用

    Handlebars.partials["myPartial"]()
    

    【讨论】:

      【解决方案4】:

      要使用模板中的部分内容,只需包含 {{> partialName}}

      <script id="base-template" type="text/x-handlebars-template">
        <div>
          {{> person}}  <!-- This is the partial template name -->
        </div>
      </script>
      
      <script id="partial-template" type="text/x-handlebars-template">
        <div class="person">
          <h2>{{first_name}} {{last_name}}</h2>
          <div class="phone">{{phone}}</div>
        </div>
      </script>
      
      <script type="text/javascript">
        $(document).ready(function() {
          var template = Handlebars.compile($("#base-template").html());
      
          //Aliasing the template to "person"
          Handlebars.registerPartial("person", $("#partial-template").html()); 
      
          template(yourData);
        }
      </script>
      

      【讨论】:

      • 我将如何从 javascript(不在模板中)呈现该部分?
      • 你的意思是这个-:el.html(this.template(yourData));
      • 仅供参考,为什么这不是公认的答案:这是在 Handlebar 的文档中很容易找到的所有信息,并且是部分的基本用法。在提出问题之前,我完全知道如何在模板中使用部分内容,但是需要深入研究 Handlebar 的源代码才能了解如何直接从 javascript 呈现部分内容。
      • 我对答案投了反对票,因为它没有解决问题
      猜你喜欢
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2013-08-31
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多