Handlebars.js Else If


241

クライアントサイドビューのレンダリングに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}}

ELSE IFをハンドルバーで実行するにはどうすればよいですか?


ハンドルバーの更新に注意してください、それはすぐに実装されるようです:github.com/wycats/handlebars.js/pull/892
Jacob van Lingen

回答:


376

ハンドルバー{{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}}

ただし、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}}

6
あまりにも多くのロジックをテンプレートに入れているということで、ハンドルバーにelsif(またはelse if)がないことのポイントです。言い換えれば、それをより小さなテンプレートに分解する必要がありますか?
Kazim Zaidi

1
@ KazimZaidi、1つのデータに3つ以上の状態があり、それぞれに異なるフォーマットが必要な場合はどうなりますか?CSSスタイルをデータ自体に強制することはできても、ビューレベルの問題をデータに押し込むことになります。if / elseif / endifコンストラクト(またはスイッチ/マッチ)の賢明なケースを想像できます。
Drew Noakes

1
これをもう一度見てみると、これは属性バインディングを通じて実行できると感じています。
Kazim Zaidi

1
私は、ブールフラグを渡してそれらを条件化することをお勧めします。1つの条件のみがtrueと評価されるようにフラグを適切に設定するかどうかは、ユーザー次第です。使用する必要はありませんelse if
chovy

ビジネスロジックをプレゼンテーションから分離するヘルパー関数を使用してこれを行うことをお勧めします。
Max Hodges 2013年

76

私は通常このフォームを使用します:

{{#if FriendStatus.IsFriend}}
  ...
{{else}} {{#if FriendStatus.FriendRequested}}
  ...
{{else}}
  ...
{{/if}}{{/if}}

良いヒント、ありがとう。これはデフォルトで反応しますか?
kylemclaren 2014年

2
かなり他の唯一の1の場合と見えるが、の場合はクローズの最後のリストがされることをより多くのあなたが持っている、長い-{{/if}}{{/if}}{{/if}}{{/if}}{{/if}}
jbyrd

1
いいえ、それは「クリーン」ではなく、醜いです。
遺伝子b。

37

ハンドルバー{{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}}

http://handlebarsjs.com/block_helpers.html


4
これは新しい答えになるはずです!
Saad Malik

私には機能しません(テンプレートの構文エラー)。Meteor 1.2.0.2
dragonmnl

@dragonmnl Meteor 1.2.0.2が使用しているハンドルバーのバージョンは?3.0を使用していることを確認してください。
Don O

デフォルトのバージョンを使用しています。ハンドルバーのバージョンを確認するにはどうすればよいですか?
dragonmnl

@dragonmnl Meteorはスペースバーと呼ばれる独自のテンプレート言語を使用しているようです。その場合、{{else if}}構文がサポートされているかどうかはわかりません。
Don O

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}}

これを実現できるように、モデルに物事を配置したい場合があります。

{{#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}}

これらのフラグの1つだけが常にtrueであることを確認してください。これif/elsif/elseをビューで使用している場合、おそらく別の場所でも使用している可能性があるため、これらの変数が不必要になることはありません。

無駄を省きます。


1
それがどれほど優れているかはわかりませんが、今日は3つの異なるビューステートを処理するためにこれが思い付き、結局これに基づいたソリューションを使用することになりました(すべてに対してチェックしているため、elseifロジックは必要ありません) 1つの値)stackoverflow.com/questions/15008564/…したがって、#if _is_friendの代わりに、非常に単純なヘルパー(回答で)を使用して文字列を使用できます。#if friend_type "is_friend"および#if friend_type "is_not_friend_yet"
ディランライヒ14年

この答えは私がハンドルバー3.0より前の最良のソリューションと考えるものです。DOMツリーにロジックを詰め込もうとするのではなく、追加のHTMLの方が良いと思います。
David O'Regan 2016年

7

私はこの簡単なヘルパーを書きました:

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);
  }
});

ハンドルバーの責任の連鎖パターンのようなものです

例:

    {{#conditions}}
        {{#next condition1}}
            Hello 1!!!
        {{/next}}
        {{#next condition2}}
            Hello 2!!!
        {{/next}}
        {{#next condition3}}
            Hello 3!!!
        {{/next}}
        {{#next condition4}}
            Hello 4!!!
        {{/next}}
    {{/conditions}}

それは他ではありませんが、場合によってはあなたを助けるかもしれません)


1

組み込みヘルパー

#if

ifヘルパーを使用して、条件付きでブロックをレンダリングできます。引数がfalse、未定義、null、 ""、0、または[]を返す場合、ハンドルバーはブロックをレンダリングしません。

テンプレート

<div class="entry">
  {{#if author}}
    <h1>{{firstName}} {{lastName}}</h1>
  {{else}}
    <h1>Unknown Author</h1>
  {{/if}}
</div>

上記のテンプレートに次の入力を渡すと

{
  author: true,
  firstName: "Yehuda",
  lastName: "Katz"
}

0

こんにちは私はマイナーなクラス名の編集しか持っていません。ヘルパーに複数のパラメーターを渡す必要があると思います。

server.js

app.engine('handlebars', ViewEngine({
        "helpers":{
                isActive: (val, options)=>{
                    if (val === 3 || val === 0){
                        return options.fn(this)
                    }
                } 
        }
}));

header.handlebars

<ul class="navlist">
          <li   class="navitem navlink {{#isActive 0}}active{{/isActive}}"
                ><a href="#">Home</a></li>
          <li   class="navitem navlink {{#isActive 1}}active{{/isActive}}"
                ><a href="#">Trending</a></li>
          <li   class="navitem navlink {{#isActive 2}}active{{/isActive}}"
                ><a href="#">People</a></li>
          <li   class="navitem navlink {{#isActive 3}}active{{/isActive}}"
                ><a href="#">Mystery</a></li>
          <li class="navitem navbar-search">
            <input type="text" id="navbar-search-input" placeholder="Search...">
            <button type="button" id="navbar-search-button"><i class="fas fa-search"></i></button>
          </li>
        </ul>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.