如果Handlebars助手没有`with`语句扩展

时间:2018-06-12 23:20:30

标签: javascript handlebars.js eval with-statement

上下文

SaaS平台已经实现了Handlebars并提供了一个名为xif的帮助器,它有一个参数(带有一些表达式的字符串),它被评估为渲染块。

例如:

{{#xif 'foo=="bar"'}}
  Congratulations
{{else}}
  Nothing for you
{{/xif}}

我希望模拟这个自定义帮助程序,以便在SaaS平台之外进行测试(它不提供其辅助函数定义的可见性)。这个要点已经成功地模仿了帮助行为:https://gist.github.com/akhoury/9118682

问题

该解决方案使用with语句将模板中作用于范围的Handlebars字段用于附带的eval语句(this对象的属性)。

由于此代码不会通过严格模式,无论如何都要替换此实现中的with语句,但仍然会将字段提供给eval语句或更好地替换evalwith完全?

我必须维护SaaS平台的帮助方法签名,因为没有API来修改其Handlebars帮助程序。

代码

要点作者将eval逻辑抽象为x使用的xif帮助,Handlebars.registerHelper("xif", function(expression, options) { var result; // you can change the context, or merge it with options.data, options.hash var context = this; // yup, i use 'with' here to expose the context's properties as block variables // you don't need to do {{x 'this.age + 2'}} // but you can also do {{x 'age + 2'}} // HOWEVER including an UNINITIALIZED var in a expression will return undefined as the result. with(context) { result = (function() { try { return eval(expression); } catch (e) { console.warn('•Expression: {{x \'' + expression + '\'}}\n•JS-Error: ', e, '\n•Context: ', context); } }).call(context); // to make eval's lexical this=context } return (result ? options.fn(this) : options.inverse(this)); }); 使用,以下是为了方便而合并的

from

0 个答案:

没有答案