模板处理程序中的流星异常

时间:2017-03-14 21:44:13

标签: meteor flow-router

这个问题类似于找到here的问题,具体来说,我的Meteor应用程序按照预期的那样做,但是在这些行中将一个丑陋的错误转储到控制台中:

[Log] Exception in template helper: project@http://localhost:3000/app/app.js?hash=9d27a5d54ce7e2e0519a4359c523c992bfdc3894:991:54 (meteor.js, line 930)
...60 lines snipped...
onclick@http://localhost:3000/packages/kadira_flow-router.js?hash=a7cc426e8dadbfad936f4f03bda0e74ded30ae36:1617:14

另一个相关问题的答案表明,这是由于在尚未加载对象时尝试访问该对象引起的。但是,我试图按如下方式防止这种情况。

数据来自服务器main.js,因此:

Meteor.publish('oneCount', function countPublication(countId) {
    let oneCount = Counts.find({_id: countId});
    return oneCount
});

现在,Flow Router配置:

FlowRouter.route('/edit_count/:countId', {
    subscriptions: function(params) {
        this.register('currentCount', Meteor.subscribe('oneCount', params.countId));
    },
    action: function(params) {
        BlazeLayout.render('MainLayout', {content: 'EditCount', countId: params.countId})
    }
 });

并且,在EditCount模板和相关的javascript中:

 {{#if isReady }}
     ...
     <a class="btn" href="/count/{{ project }}">Project</a>
     ...
 {{else}}
     {{> Loading}}
 {{/if}}

 Template.EditCount.helpers({
    project: function() {
        const project = Projects.findOne({counts: this.countId()});
        return project._id;

    },
    isReady: function(sub) {
        if(sub) {
            return FlowRouter.subsReady(sub);
        } else {
            return FlowRouter.subsReady();
        }
     }
 })

我得到的错误并未涉及我的代码的特定部分,主要是blaze和flow-router。

我已经读过在路由器中订阅可能现在被认为是不好的形式,所以我用这个替换了代码:

FlowRouter.route('/edit_count/:countId', {
    name: 'edit_count',
    action: function(params) {
        BlazeLayout.render('MainLayout', {content: 'EditCount', countId: params.countId})
    }
});

Template.EditCount.onCreated(function() {
    this.subscribe('oneCount', this.countId());
})

...然后,在模板中使用Template.subscriptionsReady而不是isReady函数。但是,现在没有任何渲染,我从app.js获得Exception in defer callback

如果有人有任何关于哪种最佳模式以及如何解决它的建议,那将非常感激。

编辑:

我从所有路线中删除了订阅,并将它们放入模板中。如果我尝试使用返回单个结果的出版物,那么我会得到上面的Exception in defer callback错误,但是订阅了所有记录的出版物。然而,尽管现在在模板中订阅我仍然得到Exception in template helper,这是相当令人沮丧的。

1 个答案:

答案 0 :(得分:0)

最终,解决方案原来是here。具体做法是:

  • 将订阅放在模板.js文件的autorun块中。
  • 在模板助手中获取FlowRouter参数。
  • 使用{{#with currentProject}}(或其他)标记包装UI代码。