【问题标题】:Use dependant subscriptions in Iron-router WaitOn and use them in helper functions在 Iron-router WaitOn 中使用依赖订阅并在辅助函数中使用它们
【发布时间】:2023-03-20 11:15:01
【问题描述】:

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

在 Iron-router 的全局配置中,我订阅了“通知”发布。 然后我获取通知,并根据类型收集元素的 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);

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

【问题讨论】:

    标签: mongodb meteor iron-router


    【解决方案1】:

    只是一个想法,您是否尝试过使用Deps.autorun ('notificationsAnswers' with a Session variable),并在您的函数通知中与Session.set() 一起返回?

    所以你只有waitOn提问,一旦找到q.targetObjectId,设置Session的回答就会触发其订阅。

    【讨论】:

      【解决方案2】:

      解决方法是移动这段代码:

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

      到同一个全局 Iron-router 配置中的 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 2015-07-07
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多