如何在Template onCreated中使用findOne并在帮助器

时间:2016-11-21 00:21:29

标签: meteor meteor-blaze meteor-collections

这是我的模板onCreated和helper函数。我提供了内联评论以增加一些清晰度。我可以看到self.post最终被设置,因为当我登录Template.instance()时它出现在我的控制台上。但是,当我记录Template.instance()。post时,它总是未定义的。

Template.default.onCreated(function() {
    var self = this;
    self.autorun(function() {
        var postId = FlowRouter.getParam('post_id');
        self.subscribe('onePost', postId);
        self.post = Posts.findOne(FlowRouter.getParam('post_id'));
    });
});
Template.default.helpers({
    poststage: function(stage) {
        console.log(Template.instance()); // I can see post object here
        console.log(Template.instance().post; //always undefined
        if(Template.instance().post) {
            // never true
            return Template.instance().post.stage == stage;
        }
    }
});
Template.default.events({
    'submit form':function(event, instance) {
        Meteor.call('someFunc', instance.post.anotherField);
    }
});

编辑:我应该补充一点,我试图避免两次编写查询,因为我也在模板事件中使用它。 (见代码)。

1 个答案:

答案 0 :(得分:0)

这感觉就像一个时间问题。您正在订阅onePost出版物,但在分配.ready()之前,您并没有等待该订阅self.post autorun也似乎是多余的。您不需要在onCreated块中重新运行该代码块。我建议:

Template.default.onCreated(function() {
  this.postId = FlowRouter.getParam('post_id');
  self.subscription = subscribe('onePost', this.postId);
});
Template.default.helpers({
  poststage: function(stage) {
    if ( this.subscription.ready()  ){
      return Posts.findOne(this.postId).stage;
    }
  }
});