Handlebars.js否则如果

rea*_*ers 230 handlebars.js

我正在使用Handlebars.js进行客户端视图渲染.如果Else工作得很好但我遇到了需要ELSE IF的3路条件:

这不起作用:

{{#if FriendStatus.IsFriend }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

如何使用把手进行ELSE IF?

Car*_*arl 355

Handlebars支持{{else if}}3.0.0以上的块.

车把v3.0.0或更高:

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else if FriendStatus.FriendRequested}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{else}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

但是,在Handlebars v3.0.0之前,您必须定义一个帮助程序来if手动处理分支逻辑或嵌套语句:

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else}}
  {{#if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
  {{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
  {{/if}}
{{/if}}
Run Code Online (Sandbox Code Playgroud)

  • 是否在手把中没有elsif(或者if),你在模板中加入了太多的逻辑.换句话说,您需要将其分解为更小的模板吗? (6认同)
  • @KazimZaidi,如果您有一个包含三个以上状态的数据,并且在每种情况下都需要不同的格式怎么办?您或许可以将 CSS 样式强加到数据本身中,但随后您将视图级别的问题推入了数据中。我可以想象 if/elseif/endif 构造(甚至是 switch/match)的合理情况。 (2认同)

dri*_*nor 75

我通常使用这种形式:

{{#if FriendStatus.IsFriend}}
  ...
{{else}} {{#if FriendStatus.FriendRequested}}
  ...
{{else}}
  ...
{{/if}}{{/if}}
Run Code Online (Sandbox Code Playgroud)

  • 它更漂亮,更容易阅读,所以我喜欢它. (6认同)
  • 看起来很漂亮只有1,如果,但你拥有的越多,最后一个结束列表得到的时间越长 - "{{/ if}} {{/ if}} {{/ if}} {{/ if}} { {/如果}}` (2认同)
  • 不,它不是“更干净”,而是更丑陋。 (2认同)

Zig*_*ggy 37

车把的精神在于它是"无逻辑的".有时这会让我们觉得我们正在与它斗争,有时我们最终会遇到丑陋的嵌套if/else逻辑.你可以写一个帮手; 许多人用"更好"的条件操作员来增加把手,或者认为它应该是核心的一部分.不过,我想,不是这样,

{{#if FriendStatus.IsFriend}}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{else}}
  {{#if FriendStatus.FriendRequested}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
  {{else}}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
  {{/if}}
{{/if}}
Run Code Online (Sandbox Code Playgroud)

你可能想在你的模型中安排一些东西,这样你就可以拥有它,

{{#if is_friend }}
  <div class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></div>
{{/if}}

{{#if is_not_friend_yet }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></div>
{{/if}}

{{#if will_never_be_my_friend }}
    <div class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

只需确保这些标志中只有一个是真的.如果你if/elsif/else在视图中使用它,你可能也在其他地方使用它,所以这些变量可能不会是多余的.

保持精益.


小智 36

手柄现在支持{{else if}}3.0.0.因此,您的代码现在应该可以工作.

您可以在"条件"下看到一个示例(稍微修改一下,添加了{{else}}:

    {{#if isActive}}
      <img src="star.gif" alt="Active">
    {{else if isInactive}}
      <img src="cry.gif" alt="Inactive">
    {{else}}
      <img src="default.gif" alt="default">
    {{/if}}
Run Code Online (Sandbox Code Playgroud)

http://handlebarsjs.com/block_helpers.html

  • 这应该是新的答案! (4认同)

Kir*_*lov 6

我写了这个简单的帮手:

Handlebars.registerHelper('conditions', function (options) {
    var data = this;
    data.__check_conditions = true;
    return options.fn(this);
});


Handlebars.registerHelper('next', function(conditional, options) {
  if(conditional && this.__check_conditions) {
      this.__check_conditions = false;
      return options.fn(this);
  } else {
      return options.inverse(this);
  }
});
Run Code Online (Sandbox Code Playgroud)

这就像Handlebars中的Chain of Responsibility模式

例:

    {{#conditions}}
        {{#next condition1}}
            Hello 1!!!
        {{/next}}
        {{#next condition2}}
            Hello 2!!!
        {{/next}}
        {{#next condition3}}
            Hello 3!!!
        {{/next}}
        {{#next condition4}}
            Hello 4!!!
        {{/next}}
    {{/conditions}}
Run Code Online (Sandbox Code Playgroud)

这不是别的,但在某些情况下它可能对你有帮助)