Handlebar 上下文条目中成员函数的绑定
Binding of member functions in Handlebar context entries
我对 handlebars.js 的一致但又违反直觉的行为有疑问。
当从模板中引用上下文变量的成员函数时,在解析过程中调用它,当前上下文设置为this。这与 (block) helpers 的行为相同,因此在某种程度上是一致的。
当我们在 each 或 with 块中时,这也正是人们在编写上下文/模型时所期望的。
这是一个玩具示例:
var a = {
name: "Alice",
greet: function () {
return "Hello " + this.name;
}
};
var resultA = a.greet(); // resolves to "Hello Alice"
var templateB = Handlebars.compile("{{person.greet}}");
var resultB = templateA({ person: a }); // resolves to "Hello undefined"
var templateC = Handlebars.compile("{{#with person}} {{greet}} {{/with}}");
var resultC = templateB({ person: a }); // resolves to "Hello Alice"
http://jsfiddle.net/mischmit/2papau0L/9/
目前我使用 和 的解决方法 - 但我一点也不喜欢它。
是否有更好的方法来完成此行为(除了在成员函数中用那个明显替换它之外)?
Handlebars GitHub 页面上似乎有关于此问题的类似讨论帖。来自:
[Yehuda]'s very adamant that Handlebars draw the line at string/number properties.
推荐的方法是创建您自己的辅助方法来执行此操作。
因此,在阅读了 TheDude 向我指出的 thread 之后,我想出了这个初步的解决方案,定义了一个处理程序,以我假设的方式调用成员。
Handlebars.registerHelper('call', function(obj, func){
obj[func].apply(obj, Array.prototype.splice.call(arguments, 2, arguments.length - 3));
});
这样,我可以做到以下几点:
var templateD = Handlebars.compile("{{call person 'greet'}}");
var resultD = templateD({ person: a }); // resolves to "Hello Alice"
但是,我宁愿覆盖 Handlebars 的一些内部函数,这些函数让我区分处理程序和上下文成员函数并相应地绑定它们(或者至少传递原始的 this 指针选项 散列)。
编辑:此解决方案不允许在部分参数赋值中使用成员函数,因此用途非常有限。
我对 handlebars.js 的一致但又违反直觉的行为有疑问。
当从模板中引用上下文变量的成员函数时,在解析过程中调用它,当前上下文设置为this。这与 (block) helpers 的行为相同,因此在某种程度上是一致的。
当我们在 each 或 with 块中时,这也正是人们在编写上下文/模型时所期望的。
这是一个玩具示例:
var a = {
name: "Alice",
greet: function () {
return "Hello " + this.name;
}
};
var resultA = a.greet(); // resolves to "Hello Alice"
var templateB = Handlebars.compile("{{person.greet}}");
var resultB = templateA({ person: a }); // resolves to "Hello undefined"
var templateC = Handlebars.compile("{{#with person}} {{greet}} {{/with}}");
var resultC = templateB({ person: a }); // resolves to "Hello Alice"
http://jsfiddle.net/mischmit/2papau0L/9/
目前我使用 和 的解决方法 - 但我一点也不喜欢它。
是否有更好的方法来完成此行为(除了在成员函数中用那个明显替换它之外)?
Handlebars GitHub 页面上似乎有关于此问题的类似讨论帖。来自:
[Yehuda]'s very adamant that Handlebars draw the line at string/number properties.
推荐的方法是创建您自己的辅助方法来执行此操作。
因此,在阅读了 TheDude 向我指出的 thread 之后,我想出了这个初步的解决方案,定义了一个处理程序,以我假设的方式调用成员。
Handlebars.registerHelper('call', function(obj, func){
obj[func].apply(obj, Array.prototype.splice.call(arguments, 2, arguments.length - 3));
});
这样,我可以做到以下几点:
var templateD = Handlebars.compile("{{call person 'greet'}}");
var resultD = templateD({ person: a }); // resolves to "Hello Alice"
但是,我宁愿覆盖 Handlebars 的一些内部函数,这些函数让我区分处理程序和上下文成员函数并相应地绑定它们(或者至少传递原始的 this 指针选项 散列)。
编辑:此解决方案不允许在部分参数赋值中使用成员函数,因此用途非常有限。