【发布时间】:2013-02-26 11:40:45
【问题描述】:
您将如何更改以下代码以使其正常工作?问题在于 this == 'some message' 表达式:
<ul>
{{#each errors}}
{{#if (this == 'some message') }}
<li>Status</li>
{{else}}
<li>{{this}}</li>
{{/if}}
{{/each}}
</ul>
【问题讨论】:
您将如何更改以下代码以使其正常工作?问题在于 this == 'some message' 表达式:
<ul>
{{#each errors}}
{{#if (this == 'some message') }}
<li>Status</li>
{{else}}
<li>{{this}}</li>
{{/if}}
{{/each}}
</ul>
【问题讨论】:
最简单的方法是添加自定义 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}}
【讨论】:
{{#if_eq this "some message"}} 有效,为什么不this.someProperty?无法让它工作。
{{/if}} 结尾,而不是 {{/if_eq}},令人难以置信,在这上面浪费了几个小时,但感谢你打开我的眼睛 :-)跨度>
opts.fn 函数用于“if”分支,opts.inverse 用于else 分支。
老问题,但如果你使用 Elving 的 Swag Handlebars helpers library,你可以使用助手 is 和 isnt。
【讨论】:
这也可以通过使用 Handlebars 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);
【讨论】: