【问题标题】:My Meteor subscription doesn't update after route change路线更改后我的 Meteor 订阅未更新
【发布时间】:2017-12-11 23:11:25
【问题描述】:

我有一个收藏,questions

我通过 FlowRouter 将用户从一个路由发送到另一个路由。

第一条路线使用questions中的所有文档,但只有一个字段:_id

第二条路线只需要一个文档,但需要所有字段。

尽管在第二条路由中进行了新订阅,但只能访问旧的 _id 字段(直到用户手动刷新)。

第一个路由的组件订阅如下:

getMeteorData() {
  const questionsHandle = Meteor.subscribe('questions')

  return {
    questions: Questions.find().fetch()
  }
}

发布只发布_id字段:

Meteor.publish('hspUserQuestionsFromPracticeSet', function() {
    return Questions.find({}, {fields: {_id: 1}})
})

路由更改只需使用FlowRouter.go(newRoute)(我正在使用一些更新版本的 Flowrouter-SSR)。

第二条路线:

getMeteorData() {

    const questionHandle = Meteor.subscribe('questionById', this.props.questionId)

    return {
        question: Questions.findOne(),
        questionReady: questionHandle.ready()
    }
},

第二次发表:

Meteor.publish('questionById', function(questionId) {
    return Questions.find({_id: questionId})
})

当路由切换发生时,questions 中的所有文档都已被订阅,因此Questions.findOne() 会从该列表中找到第一个文档。所以我的文档都错了,只有一个字段。

我该如何解决这个问题?我已尝试取消订阅 componentWillUnmount 并使用仅包含 this.stop() 的新出版物,但这不起作用。

【问题讨论】:

  • 在渲染前您在哪里检查新订阅是否准备就绪?

标签: mongodb reactjs meteor


【解决方案1】:

我想你正在使用Data Loading In React

您的第一个订阅应该像第二个一样具有就绪状态,以便您确定在显示它时加载了整个列表。

getMeteorData() {
  const questionsHandle = Meteor.subscribe('questions')
  return {
    ready: questionsHandle.ready(),
    questions: Questions.find().fetch()
  }
}

您忘记了要在 findOne 中显示哪个问题。

getMeteorData() {
    const questionHandle = Meteor.subscribe('questionById', this.props.questionId)

    return {
        question: Questions.findOne(this.props.questionId),
        questionReady: questionHandle.ready()
    }
},

【讨论】:

  • 没关系。它仍然只有一个字段。
  • 是的。如果没有其他方法,我想我会加载第一条路线中的每个字段。
  • 您还可以检查您的发布是否真的被调用,以及它是否返回包含所有字段的文档
  • 已修复。它实际上可以将this.props.questionId 放在findOne 中,我完全忽略了这一点,因为我认为这只会获取正确的问题,但仍然会获取错误的字段。我不知道它为什么会起作用,但确实如此。
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2019-11-10
  • 2018-04-08
  • 2014-12-15
  • 2019-11-21
相关资源
最近更新 更多