【问题标题】:Call another property within the same template helpers object [duplicate]在同一模板助手对象中调用另一个属性[重复]
【发布时间】:2015-10-19 01:52:21
【问题描述】:

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

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”方法?

【问题讨论】:

    标签: javascript meteor meteor-blaze


    【解决方案1】:

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

    见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...除非您尝试通过 binding 来强行使用它。

    【讨论】:

    • 这是违反直觉且不方便的,但我想这是一个权衡,让this 引用模板的上下文数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2014-12-12
    • 2016-09-02
    • 2015-07-05
    • 1970-01-01
    • 2021-09-10
    • 2011-03-11
    相关资源
    最近更新 更多