如何在 mustache.js 中完成 if/else?

IT技术 javascript templates mustache
2021-01-27 21:50:06

我不知道如何在小胡子上做到这一点似乎很奇怪。是否支持?

这是我尝试的可悲尝试:

    {{#author}}
      {{#avatar}}
        <img src="{{avatar}}"/>
      {{/avatar}}
      {{#!avatar}}
        <img src="/images/default_avatar.png" height="75" width="75" />
      {{/avatar}}
    {{/author}}

这显然是不对的,但文档没有提到这样的事情。甚至没有提到“其他”这个词:(

另外,为什么小胡子是这样设计的?这种事情被认为是坏事吗?它是否试图强迫我在模型本身中设置默认值?那不可能的情况呢?

5个回答

这就是您在 Mustache 中执行 if/else 的方式(完全支持):

{{#repo}}
  <b>{{name}}</b>
{{/repo}}
{{^repo}}
  No repos :(
{{/repo}}

或者在你的情况下:

{{#author}}
  {{#avatar}}
    <img src="{{avatar}}"/>
  {{/avatar}}
  {{^avatar}}
    <img src="/images/default_avatar.png" height="75" width="75" />
  {{/avatar}}
{{/author}}

在文档中查找倒置部分:https : //github.com/janl/mustache.js#inverted-sections

@boxed 你可以用 moustache.js 做 for 循环(至少是 ngFor-ish 循环)
2021-03-19 21:50:06
@MandM 是的......所以它有逻辑,但它不能做任何有用的事情:P
2021-03-27 21:50:06
它只是让你远离 if else 逻辑。在另一个 if/else 中有很多嵌套的 if/else 是设计错误的标志
2021-03-28 21:50:06
小胡子文档很有趣。“我们称之为‘无逻辑’,因为没有 if 语句、else 子句或 for 循环。” 呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜
2021-04-04 21:50:06
@boxed,从技术上讲,您是对的,反转部分是一个逻辑语句,因为它检查标签值。但是,我认为这里的细微差别是必须明确评估两个语句,而不是单个 if/else。基本上,mustache 强制结构if (condition){ //do something}后跟一个if (!condition){//do something else}. 此外,与基于逻辑的语言相比,一个人可以在逻辑中执行的逻辑量大大减少。存在或不存在是唯一的检查,即您不能检查标签的值是否等于 5 然后落入该标签的代码中。
2021-04-11 21:50:06

这是您在“控制器”中解决的问题,这是无逻辑模板的重点。

// some function that retreived data through ajax
function( view ){

   if ( !view.avatar ) {
      // DEFAULTS can be a global settings object you define elsewhere
      // so that you don't have to maintain these values all over the place
      // in your code.
      view.avatar = DEFAULTS.AVATAR;
   }

   // do template stuff here

}

这实际上比维护图像 url 或其他媒体要好得多,这些媒体可能会或可能不会在您的模板中改变,但需要一些时间来适应。关键是要忘记模板隧道视觉,头像 img url 必然会在其他模板中使用,您是要在 X 模板上还是在单个 DEFAULTS 设置对象上维护该 url?;)

另一种选择是执行以下操作:

// augment view
view.hasAvatar = !!view.avatar;
view.noAvatar = !view.avatar;

在模板中:

{{#hasAvatar}}
    SHOW AVATAR
{{/hasAvatar}}
{{#noAvatar}}
    SHOW DEFAULT
{{/noAvatar}}

但这违背了无逻辑模板的全部含义。如果这就是你想要做的,你想要逻辑模板,你不应该使用 Mustache,但一定要给自己一个学习这个概念的公平机会;)

{{/#hasAvatar}} 和 {{/#noAvatar}} 在这个答案中应该是 {{/hasAvatar}} 和 {{/noAvatar}}。
2021-03-20 21:50:06
谢谢。这是一个很好的回应!它实际上也帮助了我在 javascript 代码结构中的其他结构方面关于“何时做某事”。
2021-04-07 21:50:06

您的else语句应如下所示(注意^):

{{^avatar}}
 ...
{{/avatar}}

在小胡子中,这被称为“倒置部分”。

请注意,您不需要 # 和 ^,它只是 ^ 用于“非”情况
2021-03-28 21:50:06
这在最新版本中不起作用。Zappan 是正确的,你只需要 ^
2021-04-05 21:50:06

请注意,您可以使用{{.}}来呈现当前上下文项。

{{#avatar}}{{.}}{{/avatar}}

{{^avatar}}missing{{/avatar}}

您可以在视图中定义一个助手。但是,条件逻辑有些限制。Moxy-Stencil ( https://github.com/dcmox/moxyscript-stencil ) 似乎用“参数化”助手解决了这个问题,例如:

{{isActive 参数}}

并在视图中:

view.isActive = function (path: string){ return path === this.path ? "class='active'" : '' }