【问题标题】:Meteor.js - Calling a template helper within template renderedMeteor.js - 在渲染的模板中调用模板助手
【发布时间】:2015-01-15 19:42:29
【问题描述】:

我正在使用 Meteor 1.0。

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

这是代码的简化版本:

Template.myTemplate.rendered = function () {

  var x = Math.random();

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

}

当我在otherTemplate 中调用{{randomNum}} 时,什么也没有发生。

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

Uncaught ReferenceError: x is not defined

想法?

【问题讨论】:

标签: templates meteor meteor-blaze


【解决方案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);
    }
});

~~~

【讨论】:

    【解决方案2】:

    这并不是真正正确的处理方式,因为 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。它可以是任何响应式数据源,并且可以工作。

    【讨论】:

    • 这更有意义!谢谢。会话变量是要走的路。
    • 我也是这样做的,但在我看来,这不是“正确的工作方式”,但我不知道另一种更好的方式。 Meteor 在工作流程中有点模糊,如果有人看到这个并且知道更好的东西,请给一些道具!
    • 将结果附加到模板实例肯定会更好(所以this.randomNum = new ReactiveVar(...);),之后我认为这似乎是一个非常可靠的工作流程。唯一的选择是使用诸如 Iron-router 的 waitOn 之类的东西,这样您就知道计算在页面呈现之前就已经完成了。异步是无法摆脱的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2013-12-06
    • 2014-07-23
    • 2014-12-08
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多