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
语句或更好地替换eval
和with
完全?
我必须维护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