我有一个控制器对象,如:
MyApp.objController = Ember.ArrayController.create({
init: function(data) {
data.isValid = function() {
return (data.validity === "valid");
}
this.pushObject(MyApp.MyObj.create(data));
}
});
我的观点如下:
{{#each MyApp.objController}}
{{#if isValid}}
<some markup>
{{else}}
<some other markup>
{{/if}}
{{/each}}
我假设Handlebars中的if
条件同时接受值和函数,但似乎并非如此。它真的有可能,我只是做错了吗?
答案 0 :(得分:9)
句柄if语句仅比较值是否存在,如果它是假值(即不存在,0,空字符串等)。您必须编写自定义帮助函数。
你可以这样做
Handlebars.registerHelper('isValid', function (value, options) {
if (value == "valid") {
return options.fn(this);
}
return options.inverse(this);
});
这会注册一个块助手。如果传入的值的计算结果为“valid”,则返回辅助程序后面的模板和当前数据。如果它没有评估为有效,则返回带有当前数据的else语句后面的模板。
然后在你的模板中你可以像这样使用它
{{#each MyApp.objController}}
{{#isValid validity}}
<some markup>
{{else}}
<some other markup>
{{/isValid}}
{{/each}}
否则,如果您想遵守Handlebars的精神并执行'无逻辑'模板,请在渲染模板之前设置一个标志,指示该数据是否有效,然后使用手柄,如果有帮助,请使用标志。
您还可以设置一个通用函数来处理这个和其他情况。请参阅Logical operator in a handlebars.js {{#if}} conditional中的答案,了解泛型if的示例(与上述答案类似)
答案 1 :(得分:6)
如果您将isValid
定义为property
,则可以在if
语句中使用它,而无需创建自定义句柄助手,请参阅http://jsfiddle.net/pangratz666/Dq6ZY/:
<强>车把强>:
<script type="text/x-handlebars" data-template-name="obj-template" >
{{view Ember.TextField valueBinding="age" }}
{{#if isValid}}
Si Si.
{{else}}
Nope!
{{/if}}
</script>
<强>的JavaScript 强>:
App.MyObj = Ember.Object.extend({
isValid: function() {
return this.get('age') >= 18;
}.property('age')
});
Ember.View.create({
templateName: 'obj-template',
controller: App.MyObj.create({
age: 21
})
}).append();
答案 2 :(得分:-1)
您可以创建自定义Handlebars助手来执行此操作。
答案 3 :(得分:-3)
试试这个:
<ul>
{{#each subsites}}
{{#if this}}
<li>{{{WhatIsTheSiteFor this}}}</li>
{{else}}
<li>no found</li>
{{/if}}
{{/each}}
</ul>
辅助函数WhatIsTheSiteFor
:
Handlebars.registerHelper('WhatIsTheSiteFor', function(siteName) {
var subSiteName = '',
siteNameStr = '';
$.each(siteName, function(i, item) {
siteNameStr += item;
return siteNameStr;
});
if(siteNameStr === 's.gbin1.com') {
subSiteName = '<a href="http://' + siteNameStr + '">GB搜索引擎</a>';
}
else if (siteNameStr === 'm.gbin1.com') {
subSiteName = '<a href="http://' + siteNameStr + '">GB手机阅读</a>';
}
else if (siteNameStr === 'rss.gbin1.com') {
subSiteName = '<a href="http://' + siteNameStr + '">RSS消息订阅</a>';
}
return subSiteName;
});
可以在此处找到演示:http://www.gbin1.com/gb/networks/uploads/71bb1c1e-0cd3-4990-a177-35ce2612ce81/demo6.html