Canache模板可以进行模板扩展吗?

Chr*_* W. 52 javascript ruby python templates mustache

我是胡子的新手.

许多模板语言(例如,Django/Jinja)将允许您扩展"父"模板,如此...

base.html文件

<html><head></head>
    <body>
    {% block content %}{% endblock %}
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

frontpage.html

{% extends "base.html" %}
{% block content %}<h1>Foobar!</h1>{% endblock %}
Run Code Online (Sandbox Code Playgroud)

渲染了frontpage.html

<html><head></head>
    <body>
    <h1>Foobar!</h1>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我知道胡子的部分(例如{{>content}}),但那些似乎只是包括.

是否存在Mustache的模板扩展?或者,做不到这一点,是有至少这有效地将一些设计模式,包括为模板扩展当量.

Wal*_*den 61

我最近发现自己在同一条船上,除了我来自mako背景.

Mustache不允许模板扩展/继承,但我知道有几个选项可用.

  1. 您可以使用部分:

    {{>header}}
        Hello {{name}}
    {{>footer}}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您可以将模板预处理函数注入到需要从其他页面继承的每个模板的上下文中:

    {{#extendBase}}      
        Hello {{name}}
    {{/extendBase}} 
    
    Run Code Online (Sandbox Code Playgroud)

    哈希:

    {
       "name": "Walden",
       "extendBase": function() {
           return function(text) {
               return "<html><head></head>" + render(text) + "</body></html>"
           }
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将所需的HTML前置并附加到控制器中的相关页面.

  4. 有一个布局模板ala:

    {{>header}}
        {{{body}}}
    {{>footer}}
    
    Run Code Online (Sandbox Code Playgroud)

    并在控制器中渲染主体,将其作为名为变量的布局模板传递给布局模板body.

  5. 在加载模板的代码中实现模板继承,pre-mustache.

但是,我不会使用三重胡子,因为我不希望未转义的HTML出现在任何地方,在我看来这太危险了.

如果其他人有更好的解决方案来解决这个问题,我也很乐意听到这个问题,因为我还没有采取过任何一个方向.

  • 胡子的[推特版](http://twitter.github.com/hogan.js/)支持[模板继承](https://gist.github.com/1854699). (8认同)
  • #4 应该是“三重胡须”吗?--`{{{body}}}` (2认同)

小智 12

我在这里建议使用Mustache规范:

https://github.com/mustache/spec/issues/38

目前mustache.java,hogan.js和phly_mustache支持模板继承.

  • 虽然,关于Hogan.js,你不会从文档中知道它:https://github.com/twitter/hogan.js/issues/70 (2认同)