通常我们可以在普通对象中执行此操作:
var obj = {
a: 2,
b: function() {
return this.a;
}
}
console.log( obj.b() ); // Output '2' in console
所以我们可以在obj.b中获得obj.a的值。
我试图在Meteor Blaze中实现同样的目标。在模板中:
<template name="mytemplate">
{{b}}
</template>
并在后面的代码中:
Template.mytemplate.helpers({
a: 2,
b: function() {
return this.a;
}
}
渲染&#39; mytemplate&#39;不会输出&#39; 2&#39;正如所料。我怎样才能打电话给&#39;方法来自&#39;&#39;功能定义?
答案 0 :(得分:0)
这是因为您的对象不会以任何方式保留。
请参阅in Blaze code:
Template.prototype.helpers = function (dict) {
for (var k in dict)
this.__helpers.set(k, dict[k]);
};
我认为函数也应用于模板数据(使用this
引导您传递给模板的数据)所以即使是方法b
的原始上下文也是kaboom,因为{{1动态评估。使用此结构无法实现您想要实现的行为。
您可以尝试将此方法绑定到其原始对象this
,但这很可怕
Blaze也可能不喜欢处理绑定函数。
要解决此问题,请使用两个不同的对象:一个用于数据,一个用于辅助方法。
obj.b = b.bind(obj)
更一般地说,当您使用的API未明确支持时,请避免依赖var data, methods;
data = { a : 2 };
methods = { b : function() { return data.a; } };
Template.myTemplate.helpers(methods);
...除非您尝试通过this
强行执行。