【问题标题】: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)。

【问题讨论】:

    标签: javascript ruby-on-rails mustache


    【解决方案1】:

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

    使用选择和反转选择

    这是来自 mustache 文档的示例:

    {
      "repos": []
    }
    

    模板:

    {{#repos}}<b>{{name}}</b>{{/repos}}
    {{^repos}}No 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 }}
      

      但这样做有点肮脏……

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 2012-01-03
      • 2014-03-29
      • 2018-09-25
      相关资源
      最近更新 更多