Meteor.js - 在呈现的模板中调用模板助手

时间:2014-11-18 15:00:46

标签: templates meteor meteor-blaze

我正在使用Meteor 1.0。

我有一个Template.*name*.rendered函数可以进行大量计算。在计算结束时,我希望输出进入Template.*name*.helpers,以便我可以在相应的html页面中使用它。

以下是代码的简化版本:

Template.myTemplate.rendered = function () {

  var x = Math.random();

  Template.otherTemplate.helpers({
    randomNum: x
  });

}

当我在{{randomNum}}中拨打otherTemplate时,没有任何反应。

我还尝试将Template.*name*.helpers放在Template.*name*.rendered之外,在这种情况下,我收到错误:

Uncaught ReferenceError: x is not defined

思想?

2 个答案:

答案 0 :(得分:5)

这不是真正正确的方式,因为Meteor的工作方式是在应用程序启动之前编译模板,而不是在运行时。虽然这些行可能是可能的(例如通过使用Template.registerHelper),但在rendered回调中将反应变量设置为特定值会更好。将帮助器设置为返回:

Session.setDefault('randomNum', 0);

Template.myTemplate.rendered = function () {
  Session.set('randomNum', Math.random());
}

Template.otherTemplate.helpers({
    randomNum: Session.get('randomNum')
});

如果您更愿意为randomNum使用私有变量,请查看ReactiveVar。它可以是任何反应数据源,它可以工作。

答案 1 :(得分:1)

您曾经将辅助工具创建为模板的对象,但由于Meteor已弃用,您现在必须在辅助函数中创建帮助程序。

现在,为了通过javascript调用帮助程序,您必须使用此函数

Template.*TemplateName*.__helpers.get('*HelperName*')(*Params*);

这是一种非常简单的方法,它可以使函数远离全局范围,因此非常干净。

以下是我如何使用此

的示例

~~~

Template.home.events({
    'click .pair': function(event) {
        var _this = $(event.currentTarget);
        Template.home.__helpers.get('pairDevice')(_this);
    }
});

Template.home.helpers({
    'devices' : function() {
        return Session.get('devices');
    },
    'pairDevice' : function(elm) {
        elm.fadeOut();
        $('.home-page').addClass('paired');
        var deviceList = [
            {
                'name' : 'Patrick\'s Phone',
                'UUID' : '234123,4n123k4nc1l2k3n4 l1k23n4l12k3nc4l12'
            },
            {
                'name' : 'Mike\'s Phone',
                'UUID' : '734k23k4l2k34l2k34l2k34l2k3m'
            },
            {
                'name' : 'Edgar\'s Phone',
                'UUID' : '567k56l7k4l56k7l5k46l74k56l74k5'
            }
        ];
        Session.set('devices', deviceList);
    }
});

~~~