在Iron-router WaitOn中使用相关订阅,并在辅助函数中使用它们

时间:2014-09-30 08:40:18

标签: mongodb meteor iron-router

在执行以下实施时,我遇到了问题,因为看起来客户端的数据不可用:

在Iron-router的全局配置中,我订阅了“notifications”发布。 然后我获取通知,并根据类型收集元素的ID。 然后我使用收集的ID订阅这些出版物。

在显示通知详细信息的模板中,我通过Notifications.find()循环通知,然后根据通知类型,我执行以下操作: 在我尝试访问元素字段时,我遇到了未定义的异常的Questions.findOne(_id)或Answers.findOne(_id)。

Router.configure({
      layoutTemplate: 'layout',
      loadingTemplate: 'loading',
      waitOn: function() { 
      Meteor.subscribe('notifications', function() {
      var notifications = Notifications.find().fetch();
        var questionsIds = _.map(_.filter(notifications, function (notif) {
        return notif.targetObjectType == 'QUESTION';
      }), function(q) { return q.targetObjectId});

     var answersIds = _.map(_.filter(notifications, function (notif) {
     return notif.targetObjectType == 'ANSWER';
     }), function(q) { return q.targetObjectId});

     Meteor.subscribe('notificationsAnswers', answersIds);
     Meteor.subscribe('notificationsQuestions', questionsIds);

如何等待“嵌套”订阅准备好在辅助函数中使用它们?

2 个答案:

答案 0 :(得分:0)

只是想一想,您是否尝试使用Deps.autorun ('notificationsAnswers' with a Session variable),并在功能通知中返回Session.set()

所以你只有waitOn个问题,一旦找到q.targetObjectId,设置答案会话就会触发其订阅。

答案 1 :(得分:0)

解决方案是移动此代码:

var notifications = Notifications.find().fetch();
        var questionsIds = _.map(_.filter(notifications, function (notif) {
        return notif.targetObjectType == 'QUESTION';
      }), function(q) { return q.targetObjectId});

     var answersIds = _.map(_.filter(notifications, function (notif) {
     return notif.targetObjectType == 'ANSWER';
     }), function(q) { return q.targetObjectId});

     Meteor.subscribe('notificationsAnswers', answersIds);
     Meteor.subscribe('notificationsQuestions', questionsIds);

到同一个全局铁路由器配置中的onBeforeAction挂钩:

onBeforeAction : function() {

var notifications = Notifications.find().fetch();
        var questionsIds = _.map(_.filter(notifications, function (notif) {
        return notif.targetObjectType == 'QUESTION';
      }), function(q) { return q.targetObjectId});

     var answersIds = _.map(_.filter(notifications, function (notif) {
     return notif.targetObjectType == 'ANSWER';
     }), function(q) { return q.targetObjectId});

     Meteor.subscribe('notificationsAnswers', answersIds);
     Meteor.subscribe('notificationsQuestions', questionsIds);
}
相关问题