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

Call another property within the same template helpers object

通常我们可以在普通对象中这样做:

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;
    }
}

呈现 'mytemplate' 不会按预期输出“2”。如何从 'b' 函数定义中调用 'a' 方法?

这是因为您的对象没有以任何方式保存。

in Blaze code:

Template.prototype.helpers = function (dict) {
  for (var k in dict)
    this.__helpers.set(k, dict[k]);
};

我认为函数也适用于模板数据(使用 this 会引导您找到传递给模板的数据)所以即使您的方法 b 的原始上下文也是 kaboom,因为 this 是动态求值的。使用此结构无法实现您想要实现的行为。

您可以尝试将此方法绑定到它的原始对象 obj.b = b.bind(obj) 但这太可怕了。
此外,Blaze 可能不喜欢处理绑定函数。

要解决此问题,请使用两个不同的对象:一个用于数据,一个用于辅助方法。

var data, methods;

data = { a : 2 };
methods = { b : function() { return data.a; } };

Template.myTemplate.helpers(methods);

在您使用的 API 未明确支持时,以更一般的方式避免依赖 this... 除非您试图通过 bind 强制使用它。