2017-09-22 29 views
0

我想为我的Ember应用程序构建一个新的条件助手。 需要注意的是,我使用的Ember 1.10.1使用了Handlebars 2.0,我无法升级它,这将很好的解决这个版本的Ember的问题。 在写这里之前,我尝试了不同的解决方案并调试了Ember代码,我靠近解决方案,但可能我错过了一些东西。建立一个条件Ember帮手

首先,我试着用下面的方法读取车把文档:

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分支的模板)实际上是一个对象而不是一个函数。

然后,我开始调试灰烬代码,我试图遵循灰烬与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是,如果绑定属性,因为我们使用ifboundIf版本(这就是我刚才所说的),所以用于更改模板,如果属性更改。

该解决方案的问题是,该imho可能是最接近正确的是该属性计算不正确,助手打印总是错误的值。 我调试了很多而没有使其工作,所以任何帮助将非常感激,我希望这可能对其他人有用。

回答

0

好消息是你在Ember 1.10! 这意味着你有子表达式。而其简单的创建一个结合的非块帮手:

Ember.HTMLBars._registerHelper('foo', function(bar) { 
    return bar == 'bar'; 
}); 

要使用它作为一个块帮手与助手{{#if}}结合起来:

{{#if (foo model)}} 
    in if 
{{else}} 
    in else 
{{/if}} 
+0

试过,但我得到'TypeError:key.indexOf不是一个函数',除此之外,我想解决使用把手的问题而不是HTMLBars,但非常感谢您的回答! – AndreaScn

+0

你没有把手。 Ember转移到'1.10' AFAIK的HTMLBars。你从来都没有!而你的错误没有帮助。可能它或者是你的帮手或者代码中的其他地方出了问题。我试过了上面的代码。 – Lux

1

如果你想要做的是构建一个支持授权问题的条件方法,你应该看看ember-can。这是一个Ember-CLI插件(而它看起来像你在做全局变量),但旧版本使用Ember 1.10。你应该能够引用他们在那里做什么,并在你的设置拉动它