2016-11-21 5 views
0

Вот мой шаблон onCreated и helper function. Я добавил встроенные комментарии, чтобы добавить некоторую ясность. Я вижу, что self.post в конечном итоге установлен потому, что он появляется на моей консоли, когда я регистрирую Template.instance(). Однако, когда я регистрирую Template.instance(). Post, он всегда не определен.Как использовать findOne в шаблоне onCreated и получить к нему доступ в помощнике

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); 
    } 
}); 

Edit: Я хотел бы добавить, что я пытаюсь избежать написания запроса в два раза, потому что я также использую его в шаблоне событий. (см. код).

+0

Reactivevar может помочь, на метеорологической реактивности –

+0

findOne по умолчанию реактивен. –

ответ

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; 
    } 
    } 
}); 
+0

Хорошо, да, именно так я бы это сделал, но я повторно использую запрос позже в коде (в событиях). Я действительно думал переформулировать вопрос, чтобы отразить это (что я буду делать сейчас). Ответ может быть просто написать Posts.findOne ... снова. Но, я думал, почему запрос дважды? –

+0

запросы minimongo относительно дешевы, часто дешевле, чем кодировать себя в углах, пытаясь их оптимизировать. Вы также можете запросить контекст данных в содержащем шаблоне, а затем у вас есть результат запроса в 'this' –

+0

Хорошо, я собираюсь просто запросить дважды. Я оставлю этот вопрос открытым и, вероятно, немного переформулирую его, чтобы попытаться указать, как писать один запрос и использовать его в шаблоне onCreated, helpers и events. Самое неприятное, что мой пост доступен в console.log (Template.instance()); но не в Template.instance(). post. Я знаю, что он становится доступным, но он должен регистрироваться, когда он становится доступным ... о, ну ... –