有没有办法缩短
{{#if arg1}}
{{#if arg2}}
//stuff
{{/if}}
{{/if}}
只有一个if?
{{#if arg1 arg2}}
{{#if arg1 && arg2}}
上述两种情况似乎都不起作用。
答案 0 :(得分:7)
Spacebars继续将Mustache和Handlebars作为无逻辑模板语言的理念。这就是为什么即使是简单的逻辑也最好放在控制器而不是模板中。
但是,您可以define a custom block helper执行逻辑and
。
<template name="ifand">
{{#if arg1}}
{{#if arg2}}
{{> Template.contentBlock}}
{{else}}
{{> Template.elseBlock}}
{{/if}}
{{else}}
{{> Template.elseBlock}}
{{/if}}
</template>
请致电:
{{#ifand arg1="foo" arg2="bar"}}
// stuff
{{/ifand}}
您还可以学习more about passing variables into templates。
对于一般情况(and
在任意数量的参数中),您将要注册一个全局模板助手:
Template.registerHelper('and', function () {
var args = Array.prototype.slice.call(arguments, 0, -1); // exclude key=value args
var parameters = arguments[arguments.length - 1]; // key: value arguments
return _.every(args, function (arg) {
return !!arg;
});
});
请致电:
{{#if and 1 "foo" 3 'bar' param="test"}}
True
{{else}}
False
{{/if}}
答案 1 :(得分:1)
在模板中,您可以使用 this 对象来引用传入的参数,这样我就可以避免在我需要的大多数情况下使用多个#if争论。
Template.myTemplate.created = function() {
if(this.data.arg1 && this.data.arg2) {
//do JS setup here
}
}
此外,可以使用
指定帮助程序Template.registerHelper('exists', function() {
if(this.data.arg1 && this.data.arg2) {
return true
}
}
并执行上述帮助
{{#if exists}}
//stuff
{{/if}}
{{> myTemplate arg1 arg2}}
我偶然偶然发现了这件事,但对我来说这是一个巨大的发现。