我正在尝试为我的Ember应用程序构建一个新的条件帮助器。 重要提一下,我使用的是使用Handlebars 2.0的Ember 1.10.1而我无法升级它,这将很好地解决了这个版本的Ember的问题。 在写这篇文章之前,我尝试了不同的解决方案并调试了很多Ember代码,我接近解决方案,但可能我错过了一些东西。
首先,我尝试使用以下方法阅读Handlebar文档:
Ember.Handlebars.registerHelper('helperName', function(conditional, options) {
if(conditional) {
return options.fn(this);
} else {
return options.inverse(this);
}
});
这里是模板:
{{#helperName booleanCondition}}
print true
{{else}}
print false
{{/helperName}}
一切正常,调用fn
函数,但inversion
函数(用于呈现else分支的模板)实际上是一个对象而不是一个函数。
然后我开始调试Ember代码,并尝试按照Ember与if
帮助程序使用的相同方法,因此我最终得到以下内容:
Ember.Handlebars.registerHelper('helperName', function(condition, options) {
var permission = Ember.Object.extend({
can: Ember.computed(function() {
return condition;
})
}).create();
Ember.Handlebars.helpers.boundIf.helperFunction.call(this, ["can"], permission, options, options.data.buffer);
});
can
是绑定到if的属性,用于在属性更改时更改模板,因为我们使用的是boundIf
if
版本(我做的只是SAID)。
这个解决方案的问题,即imho可能是最接近正确的,是该属性未正确计算并且帮助程序始终打印false值。 我调试了很多而没有让它工作,所以任何帮助都会非常感激,我希望这对其他人也有用。
答案 0 :(得分:1)
如果您要做的是构建支持授权问题的条件方法,则应该查看ember-can
。它是一个Ember-CLI插件(虽然它看起来像是在做全局变量),但旧版本与Ember 1.10配合使用。您应该能够参考他们在那里做的事情并将其拉入您的设置
答案 1 :(得分:0)
好消息是你在Ember 1.10
!
这意味着你有子表达式。并且创建绑定的非块帮助器很简单:
Ember.HTMLBars._registerHelper('foo', function(bar) {
return bar == 'bar';
});
将它用作块助手将其与{{#if}}
助手结合使用:
{{#if (foo model)}}
in if
{{else}}
in else
{{/if}}