2013-02-26 86 views
37

你会如何改变下面的代码来使它工作?问题是这== '一些信息' 的表达:Handlebars.js if block helper ==

<ul> 
    {{#each errors}} 
    {{#if (this == 'some message') }} 
    <li>Status</li> 
    {{else}} 
    <li>{{this}}</li> 
    {{/if}} 
    {{/each}} 
</ul> 

回答

78

最简单的事情将是添加自定义if_eq帮手:

Handlebars.registerHelper('if_eq', function(a, b, opts) { 
    if(a == b) // Or === depending on your needs 
     return opts.fn(this); 
    else 
     return opts.inverse(this); 
}); 

,然后调整自己的模板:

{{#if_eq this "some message"}} 
    ... 
{{else}} 
    ... 
{{/if_eq}} 

演示:http://jsfiddle.net/ambiguous/d4adQ/

如果您的errors项不是简单的字符串,那么你可以添加“这是某种信息”标志给他们,并使用标准{{#if}}(注意,直接将属性添加到字符串将无法正常工作那么好):

for(var i = 0; i < errors.length; ++i) 
    errors[i] = { msg: errors[i], is_status: errors[i] === 'some message' }; 

和:

{{#if is_status}} 
    <li>Status</li> 
{{else}} 
    <li>{{msg}}</li> 
{{/if}} 

演示:http://jsfiddle.net/ambiguous/9sFm7/

+0

如果'{{#if_eq这个 “一些信息”}}'的作品,为什么不'这一点。 someProperty'?无法让它工作。 – raffian 2013-12-29 05:06:10

+0

@raffian:你有没有一个例子(可能是对答案中的一个小窍门的修改)你想要做什么? – 2013-12-29 05:07:49

+0

..正在建造一个小提琴,然后注意到我的自定义帮手以'{{/ if}}'结束,而不是'{{/ if_eq}}',令人难以置信,浪费了几个小时,但谢谢你打开我的眼睛: - ) – raffian 2013-12-29 05:48:18

9

老问题,但如果你使用Elving的Swag Handlebars helpers library,你可以使用助手isisnt

+0

绝对惊人! – 2015-11-02 22:58:45

+0

这个库非常有用! – caballerog 2016-04-20 08:36:42

5

这也可以通过使用把手Subexpressions来实现。

模板 -

<script id="tmplStatus" type="text/x-handlebars"> 
     <ul> 
      {{#each errors}} 
       {{#if (is_status this 'some message')}} 
        <li>Status</li> 
       {{else}} 
        <li>{{this}}</li> 
       {{/if}} 
      {{/each}} 
     </ul> 
    </script> 

使用Javascript -

var errors = [ 
     'Where is pancakes house?', 
     'some message', 
     'One cent stamp' 
    ]; 

    Handlebars.registerHelper('is_status', function(msg, matchMsg, options) 
    { 
     if(msg === matchMsg) 
      return true; 
     else 
      return false; 
    }); 

    var tmplStatus = Handlebars.compile($('#tmplStatus').html()), 
     domStatus = tmplStatus({ errors: errors }); 
    $('body').append(domStatus); 

工作演示:http://jsfiddle.net/techgeeek/b99qwtpw/

+0

对于可重用性来说,将helper命名为is_equal或更好的方法会更有意义,没有意义将其直接绑定到状态。 – 2016-02-11 16:49:36