小胡子条件和循环

Posted

技术标签:

【中文标题】小胡子条件和循环【英文标题】:Mustache Conditions and Loops 【发布时间】:2013-02-09 02:50:51 【问题描述】:

这里是资源:

JSON


  "badges":
    "unlocked": [
      "name": "Win 1",
      "name": "Win 2",
      "name": "Win 3"
    ],
    "locked":[
      "name": "Lose 1",
      "name": "Lose 2",
      "name": "Lose 3"
    ]
  

算法

 if_has_badges 
<div class="badges">
  <h1>Badges</h1>

   if_has_badges_unlocked 
    <div class="badges-unlocked">
      <h2>Unlocked!</h2>
       loop_badges_unlocked 
      <a href="#" class="badge">
        <strong> name </strong>
      </a>
       end_loop_badges_unlocked 
    </div>
   end_if_has_badges_unlocked 

   if_has_badges_locked 
    <div class="badges-locked">
      <h2>Locked!</h2>
       loop_badges_locked 
      <a href="#" class="badge">
        <strong> name </strong>
      </a>
       end_loop_badges_locked 
    </div>
   end_if_has_badges_locked 

</div>
 end_if_has_badges 

我如何编写这个算法来使用 Mustache 编译器?

我需要这样做才能在两个方面工作,第一个是 RubyOnRails 应用程序,第二个是客户端 (javascript)。

【问题讨论】:

【参考方案1】:

您的问题有两种解决方案。

使用选择和反转选择

这是来自 mustache 文档的示例:


  "repos": []

模板:

#repos<b>name</b>/repos
^reposNo repos :(/repos

输出:

No repos :(

正如你看到的倒选让我做条件逻辑。在您的情况下,它看起来像:

json:

var viewModel = 
    badges:[]//badges here

viewModel.anyBadges = badges.length >0;

小胡子:

    <div class="badges-unlocked">
   #anyBadges
      <h2>Unlocked!</h2>
   /anyBadges
   #badges_unlocked
      <a href="#" class="badge">
        <strong> name </strong>
      </a>
   /badges_unlocked

不要在无逻辑的模板中做逻辑

这就是我要做的。如果您的 Mustache 模板中有条件逻辑,我认为您做错了。您可以使用Handlebars,这在这方面更先进,或者将您的逻辑移到其他地方(到您的javascript)。

请看Mustache readme

【讨论】:

【参考方案2】:

最佳答案(对于 Ruby 和 JavaScript)是将您的逻辑(if_has_badges 类型的问题)封装到 View 类中。

您实际上可以通过使用数组length 属性来伪造它以实现 Ruby 和 JavaScript 中所需的一点逻辑:

# badges.length 
<div class="badges">
  <h1>Badges</h1>

  # badges.unlocked.length 
    <div class="badges-unlocked">
      <h2>Unlocked!</h2>
      # badges.unlocked 
      <a href="#" class="badge">
        <strong> name </strong>
      </a>
      / badges.unlocked 
    </div>
  / badges.unlocked.length 

  # badges.locked.length 
    <div class="badges-locked">
      <h2>Locked!</h2>
      # badges.locked 
      <a href="#" class="badge">
        <strong> name </strong>
      </a>
      / badges.locked 
    </div>
  # badges.locked.length 

</div>
/ badges.length 

但这样做有点肮脏……

【讨论】:

脏但有效:) 类似的答案在这里:***.com/a/17897136/188926

以上是关于小胡子条件和循环的主要内容,如果未能解决你的问题,请参考以下文章

while循环的条件?

循环语句和条件语句

while和do-while循环结构

ASP中的条件语句和循环语句

while循环的条件写1代表啥意思?

关于循环的整理