mustache 胡子 无逻辑模板介绍 和 json 逗号解决方案

文章目录

  • 概要
  • 经典的Mustache 模板:
    • 给定以下哈希值:
    • 将产生以下内容:
    • 问题:产生逗号的原因
    • 解决办法
  • 描述
  • 标签类型
    • 变数
      • 模板 Template:
      • 输出 Output:
    • 栏目Sections
      • 模板 Template:
      • 输出 Output:
    • 非空清单
      • 模板 Template:
      • 输出 Output:
    • Lambdas
      • 模板:Template:
      • 输出 Output:
    • 非假值 Non-False Values
      • 模板:Template:
      • 输出 Output:
    • Inverted Sections 倒段
      • 模板:Template:
      • 输出:Output:
    • 注释:Comments
    • 部分:Partials
    • 设置定界符Set Delimiter

官方网站:

https://mustache.github.io/mustache.5.html

概要

mustache - Logic-less templates.

mustache - 无逻辑模板

经典的Mustache 模板:

Hello {
    {name}}
You have just won {
    {value}} dollars!
{
    {#in_ca}}
Well, {
    {taxed_value}} dollars, after taxes.
{
    {/in_ca}}

给定以下哈希值:

{
  "name": "Chris",
  "value": 10000,
  "taxed_value": 10000 - (10000 * 0.4),
  "in_ca": true
}

将产生以下内容:

Hello Chris
You have just won 10000 dollars!
Well, 6000.0 dollars, after taxes.

问题:产生逗号的原因

json的数据,需要拼接逗号,但是逗号出现的情况有多重

解决办法

{
     
  {
     {
     #a}}
  {
     {
     #b}}
  ,
  {
     {
     /b}}
  {
     {
     /a}}
  {
     {
     #b}}
  {
     {
     /b}}
}

描述

Mustache 可以用于HTML,配置文件,源代码-任何东西。它通过使用散列或对象中提供的值在模板中扩展标签来工作。

我们称其为“无逻辑”,因为没有if语句,else子句或for循环。相反,只有标签。有些标签被替换为一个值,有些则被替换为空,而另一些则被替换为一系列值。本文档介绍了Mustache标签的不同类型。

标签类型

标签由 double mustaches. { {person}} 是一个标签,和一样 { {#person}}. 在这两个示例中,我们将其person称为键或标记键。让我们谈谈不同类型的标签。

变数

最基本的标签类型是变量。一个 { {name}} 在一个基本的模板标签将尝试找到name在目前情况下键。如果没有name键,则将递归检查父上下文。如果到达最上层上下文并且name仍然找不到该键,则不会呈现任何内容。

默认情况下,所有变量都是HTML转义的。如果要返回未转义的HTML,请使用 triple mustache: { { {name}}}.

您还可以使用&取消转义变量: { {& name}}. 更改定界符时,这可能很有用(请参见下面的“设置定界符”)。

默认情况下,变量“ miss”返回空字符串。通常可以在您的Mustache库中进行配置。例如,Mustache的Ruby版本支持在这种情况下引发异常。

模板 Template:

* {
    {name}}
* {
    {age}}
* {
    {company}}
* {
    {
    {company}}}

Hash:

{
  "name": "Chris",
  "company": "GitHub"
}

输出 Output:

* Chris
*
* <b>GitHub</b>
* GitHub

栏目Sections

部分根据当前上下文中键的值,将文本块渲染一次或多次。

一段以井号开始,以斜杠结束。也就是说, { {#person}} begins a “person” section while { {/person}} ends it.

该部分的行为由键的值确定。

假值或空列表

如果person键存在并且值为false或空白列表,则不会显示井号和斜杠之间的HTML。

模板 Template:

Shown.
{
    {#person}}
  Never shown!
{
    {/person}}

Hash:

{
  "person": false
}

输出 Output:

Shown.

非空清单

如果person键存在并且具有非false值,则井号和斜杠之间的HTML将被渲染并显示一次或多次。

当值是非空列表时,对于列表中的每个项目,块中的文本将显示一次。每次迭代时,块的上下文将被设置为当前项。这样我们就可以遍历集合。

模板 Template:

{
    {#repo}}
  {
    {name}}
{
    {/repo}}

Hash:

{
  "repo": [
    { "name": "resque" },
    { "name": "hub" },
    { "name": "rip" }
  ]
}

输出 Output:

resque
hub
rip

Lambdas

When the value is a callable object, such as a function or lambda, the object will be invoked and passed the block of text. The text passed is the literal block, unrendered. { {tags}} will not have been expanded - the lambda should do that on its own. In this way you can implement filters or caching.

模板:Template:

{
    {#wrapped}}
  {
    {name}} is awesome.
{
    {/wrapped}}

Hash:

{
  "name": "Willy",
  "wrapped": function() {
    return function(text, render) {
      return "" + render(text) + ""
    }
  }
}

输出 Output:

Willy is awesome.

非假值 Non-False Values

当该值是非false而不是列表时,它将用作块的单个呈现的上下文。

模板:Template:

{
    {#person?}}
  Hi {
    {name}}!
{
    {/person?}}

Hash:

{
  "person?": { "name": "Jon" }
}

输出 Output:

Hi Jon!

Inverted Sections 倒段

倒置的部分以尖号(帽子)开始,以斜线结束. That is { {^person}} begins a “person” inverted section while { {/person}} ends it.

section可用于根据键的值一次或多次呈现文本,相反的section可根据键的逆值呈现文本一次。也就是说,如果键不存在、为false或列表为空,则将呈现它们。

模板:Template:

{
    {#repo}}
  {
    {name}}
{
    {/repo}}
{
    {^repo}}
  No repos :(
{
    {/repo}}

Hash:

{
  "repo": []
}

输出:Output:

No repos :(

注释:Comments

注释一开始就会被忽略。以下模板:

Today{ {! ignore me }}.

将呈现如下:

Today.

评论中可能包含换行符。

部分:Partials

偏号以大于号开头,例如 { {> box}}.

部分是在运行时呈现的(与编译时相反),因此递归部分是可能的。只是避免无限循环。

它们还继承了调用上下文。而在[ERB](http://en.wikipedia.org/wiki/ERuby)文件中,您可能会这样:

<%= partial :next_more, :start => start, :size => size %>

Mustache 只需要这样:

{
    {> next_more}}

为什么?因为该next_more.mustache文件将从调用上下文中继承size和 start方法。

通过这种方式,您可能会想将部分视为包括,导入,模板扩展,嵌套模板或子模板,即使这些从字面上看并非如此。

例如,此模板和部分模板:

base.mustache:

Names

{ {#names}} { {> user}} { {/names}}

user.mustache:
{ {name}}

可以认为是单个扩展模板:

Names

{ {#names}} { {name}} { {/names}}

设置定界符Set Delimiter

Set Delimiter标签以等号开头,并将标签定界符从{ {和更改}}为自定义字符串。

考虑以下人为的示例:

* {
    {default_tags}}
{
    {=<% %>=}}
* <% erb_style_tags %>
<%={
    { }}=%>
* {
    { default_tags_again }}

在这里,我们列出了三个项目。第一项使用默认标记样式,第二项使用Set Delimiter标记定义的erb样式,第三项在另一个Set Delimiter声明之后返回默认样式。

根据ctemplates的说法,“这对于TeX这样的语言很有用,因为TeX可能在文本中出现双括号,并且很难用于标记。”

自定义定界符不得包含空格或等号。

Custom delimiters may not contain whitespace or the equals sign.

COPYRIGHT
Mustache is Copyright © 2009 Chris Wanstrath

Original CTemplate by Google

你可能感兴趣的:(mustache,mustache)