构建条件Ember帮助器

时间:2017-09-22 10:46:36

标签: javascript ember.js handlebars.js ember-cli

我正在尝试为我的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值。 我调试了很多而没有让它工作,所以任何帮助都会非常感激,我希望这对其他人也有用。

2 个答案:

答案 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}}