在同一模板助手对象中调用另一个属性

时间:2015-07-28 13:16:47

标签: javascript meteor meteor-blaze

通常我们可以在普通对象中执行此操作:

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;功能定义?

1 个答案:

答案 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强行执行。