Meteor:模板助手

时间:2017-05-18 20:19:52

标签: meteor

Meteor中的此代码。

Template.message.helpers({
    message: function() {
        var message = Messages.findOne({ _id: FlowRouter.getParam('messageId')});
        var curTime = new Date();
        console.log(message.createdAt.getHours());

        return message;
    }
});

给我这个例外:

Exception in template helper: message@http://localhost:3000/app/app.js?hash=0da6be4507e857f169e0cecb7b0874729eae4663:239:13
bindDataContext/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3051:14
Blaze._wrapCatchingExceptions/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1715:14
wrapHelper/</<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3103:14
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3744:12
wrapHelper/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3102:12
Spacebars.dot@http://localhost:3000/packages/spacebars.js?hash=ebf9381e7fc625d41acb0df14995b7614360858a:234:13
template.message.js/Template.message</<@http://localhost:3000/app/app.js?hash=0da6be4507e857f169e0cecb7b0874729eae4663:85:31
doRender@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2086:20
viewAutorun/</<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1934:18
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3744:12
viewAutorun/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1932:14
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2271:12
viewAutorun@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1931:12
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:339:5
Tracker.Computation@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:229:5
Tracker.autorun@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:613:11
Blaze.View.prototype.autorun@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1944:14
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2080:5
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:640:12
Blaze._materializeView@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2079:3
materializeDOMInner@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1532:9
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1474:3
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1483:7
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2113:25
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:640:12
Blaze._materializeView@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2079:3
Blaze.render@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2370:3
_render@http://localhost:3000/packages/kadira_blaze-layout.js?hash=dbd1396d04e62378fc8792cdef18869a1108cedd:204:5
render/</<@http://localhost:3000/packages/kadira_blaze-layout.js?hash=dbd1396d04e62378fc8792cdef18869a1108cedd:77:9
withValue@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:1077:17
withoutInvocation/<@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:464:26
Meteor.bindEnvironment/<@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:1105:17
onGlobalMessage@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:401:11
  meteor.js:930:11

它实际上被打印了两次,但我觉得它很大,没有必要在这里展示两次。

app.js的第239行看起来像这样(这里是第7行)。

Template.message.helpers({                                                                            // 34
    message: function () {                                                                            // 35
        var message = Messages.findOne({                                                              // 36
            _id: FlowRouter.getParam('messageId')                                                     // 36
        });                                                                                           // 36
        var curTime = new Date();                                                                     // 37
        console.log(message.createdAt.getHours());                                                    // 38
        return message;                                                                               // 40
    }                                                                                                 // 41

但是时间仍然会打印到控制台。

我的目标是使用createdAt日期从当前Date对象中减去它并获得时间增量。但我从来没有这么远,因为无论我尝试用message.createdAt做什么产生这个奇怪的异常。

如果我只是做console.log(message.createdAt),我会在浏览器控制台中看到两个ISO格式的日期,还有两个例外。

如果我尝试使用message.createdAt.getTime()之类的东西,我会得到一个Unix时间戳。

到底发生了什么事?

我实际上能够减去日期并按预期使用它,但是尽管代码有效,但异常仍然显示出来。

2 个答案:

答案 0 :(得分:2)

您看到错误的原因是因为正在运行帮助程序,尝试从尚未准备好的订阅中获取数据。它最终有效,因为一旦订阅 准备就绪,帮助程序就会重新运行,一切都很顺利。要解决此问题,只需使用Template.subscriptionsReady

包装助手即可
<template name="message">
  {{#if Template.subscriptionsReady}}
    {{message}}
  {{else}}
    {{> SomeLoadingTemplate}}
  {{/if}
</template>
  

注意:此模板仅在全部执行时才会执行message帮助程序   模板级订阅是&#34; Ready&#34;而是会显示一个   加载器模板执行else部分。

关于问题的评论,用if (date) {...}包装你的逻辑:这将消除错误,但并不能真正解决问题。当没有必要时,助手仍在运行多次。隐藏这样的潜在错误似乎有点code smell

答案 1 :(得分:-1)

你有一个模板,一个助手和一个所有叫做#34; message&#34;的局部变量。即使这不是您错误的来源,我也会轻轻地建议他们使用不同的名称。