2011-12-18 8 views
1

handlebars.js結果jsonに応じて2つのhtmlブロックを表示したいとします。Handlerbars.js #if文でヘルパー関数を使用する

私の店で商品を注文したことに感謝したいとします。 私はこのように私のhandlerbars.jsテンプレートを記述します。

<p>{{name}}</p> 
{{#if costIsZero}} 
    Can't find any order 
{{else}} 
    You bought {{cost}} items in our shop, thanks. 
{{/if}} 

私はこのようなcostIsZeroためのシンプルなヘルパーをコーディングしています:

Handlebars.registerHelper('costIsZero', function(){ 
    return this.cost == 0 
}); 

私は、次のようなJSONデータとそれを混ぜるとき:

「コスト」の値が何であれ、{{#if costIsZero}}は常に真であると思われます。 私はヘルパー自体をコメントアウトして、costIsZeroのために何も持たないので、常にfalseを返します。

上記のすべてのコードは、私が間違ってやっている何がJSFiddle http://jsfiddle.net/gsSyt/

として利用できるのですか?

多分私はhandlebars.jsのやり方をハイジャックしているかもしれませんが、その場合、handlebars.jsで私の機能をどのように実装すればよいでしょうか?

答えて

4

ヘルパーが呼び出されないようcostIsZeroとして式を評価するとき。

あなたはこのように使用する
Handlebars.registerHelper('ifCostIsZero', function(block) { 
    if (this.cost == 0) { 
     return block(this); 
    } else { 
     return block.inverse(this); 
    } 
}); 

:あなたはifの代替として働くカスタムヘルパー作成することができ

また

{{#ifCostIsZero}} 
    Can't find any order 
{{else}} 
    You bought {{cost}} items in our shop, thanks. 
{{/ifCostIsZero}} 

を、あなたは株式if(またはunlessを使用することができます)あなたのテストはゼロに反対しています:

{{#if cost}} 
    You bought {{cost}} items in our shop, thanks. 
{{else}} 
    Can't find any order 
{{/if}} 

あなたは両方のオプションで遊ぶことができますhttp://jsfiddle.net/gsSyt/41/

+0

感謝は魅力のように働く。 – JeanLaurent

+0

小さなコメントです。ブロック(これ)はもはや有効ではありません。 block.fn(this)を使用する必要があります。 – jalogar

0

これを試してみてください:

Handlebars.registerHelper('if', function(conditional, block) { 
    if(this.cost == 0) { 
    return block(this); 
    } else { 
    return block.inverse(this); 
    } 
}) 

http://jsfiddle.net/mZbtk/2/

+3

それは動作しますが、それは奇妙なif文を過負荷に感じます。 – JeanLaurent

関連する問題