2012-04-11 3 views
13

をする私のリストが空の場合、私は出力にこれをしたいです出力この:口ひげテンプレート:私のリストが空でない場合、私がしたい、</p> <pre class="lang-html prettyprint-override"><code><div id="some-id"> </div> </code></pre> <p>:どのように非空のリストのために一度だけ出力ブロックを

<div id="some-id"> 
    <ul> 
    <li>Item 1</li> 
    <li>Item 2</li> 
    <li>etc</li> 
    </ul> 
</div> 

なお、I出力<ul></ul>タグ高々一度、リストが空の場合のみ。

次のコードは、私はPHPでこれを行うだろうかに近いですが、明らかに間違っている:

<div id="some-id"> 
{{#items}} 
    <ul> 
{{/items}} 

{{#items}} 
    <li>{{name}}</li> 
{{/items}} 

{{#items}} 
    </ul> 
{{/items}} 
</div> 

itemsは3項目リストである場合、私は3 <ul>年代を取得するつもりだ - 明らかに私が望むものではありません。

私はブール値のフラグ(hasItems、おそらく)として他のいくつかのキーを設定することができましたが、これは冗長な感じです。

ブロックを空でないリストに対して1回だけ出力することができるよりエレガントな方法はありますか?

+1

私の意見では(そして4年後)、「口ひげ」afaikでこの問題の解決策はまだありません。キーの値が真実(キーが存在し、空でないリスト、キー値が真、...)であれば** **ただ一度**レンダリングするセクションである "反転セクション"の反対が必要です。 –

答えて

4

セクションのnon-false valuesを使用できます。ここでは名前ととせずにitemsオブジェクトのレンダリングを示すjsFiddle上の例だ

<div id="some-id"> 
    {{#items}} 
    <ul> 
     {{#name}} 
     <li>{{.}}</li> 
     {{/name}} 
    </ul> 
    {{/items}} 
</div> 

からhttp://jsfiddle.net/maxbeatty/fpQwk/

nameは次のようになり items

data = { 'items' : { 'name' : ["Item 1", "Item 2", "etc"] } }; 

あなたのテンプレートの内部オブジェクトでなければならないであろう

+0

Hmmm。それは興味深い考えです。私はおそらくデータを '{'items' {'items':{'items':{{'name': 'item 1'}、{'name': 'item 2'}、{'name': 'etc' }]}}; '。ありがとう! –

+5

は、テンプレートのレンダリングが特定のケースをサポートしていないためにのみデータ構造を変更する必要があります。 – ElLocoCocoLoco

+0

データ構造を変更したくない場合は、テンプレートエンジンを変更してください。 – maxbeatty

13

データやテンプレートエンジンを再フォーマットしたり再フォーマットしたりしたくない場合は、<ul>タグをレンダリングする前にitems.lengthをチェックすることもできます。これを嫌う人もいますが、確かにマックスの答えに代わるものです。

{{#items.length}} 
    <ul> 
     {{items}} 
      <li>{{name}}</li> 
     {{/items}} 
    </ul> 
{{/items.length}} 
+4

ニース。それは、JavaScriptのJavaScript実装でのみ機能します。 –

+1

... * Mustache *のJavaScript実装... –

+1

そうですが、ほとんどの言語には、配列の長さを取得するためにチェックできるプロパティやメソッドがあります。javaでは '.size'などですそれで、ほとんどの言語に翻訳する必要があります。 – broox

1

他の2つの回答は、MustacheのRuby実装では機能しません。私の解決策は、テンプレートコンテキストの一部として追加のパラメータを送信することでした。例えば

template = <<EOF 
{{#has_items}} 
<ul> 
    {{#items}} 
     <li>{{.}}</li> 
    {{/items}} 
</ul> 
{{/has_items}} 
EOF 
items = ['one', 'two', 'three'] 
context = { items: items, has_items: items.any? } 
Mustache.render(template, context) 
関連する問題

 関連する問題