Meteor.user()会在_id,电子邮件和角色

时间:2017-01-17 20:11:16

标签: meteor meteor-react

我有一个自定义字段"显示晚了"与Meteor.user()中的其他字段进行比较。它导致我处理数据初始化的问题。我的问题是,为什么我的自定义字段显示较晚?这就是问题所在。

我已向用户添加了一个自定义字段:

if (Meteor.isServer) {
  Meteor.publish('allusers', function() {
    return Meteor.users.find({});
  });  

  Meteor.publish('userData', function () {
    if (this.userId) {
      return Meteor.users.find({_id: this.userId},
                               {fields: {'lastViewedScenarios_id': 1 }});
    } else {
      this.ready();
    }
  });
}

在客户端上,我通过createContainer获取用户数据,如下所示:

export default AppContainer = createContainer(() => {
  Meteor.subscribe('userData');

  return {
    currentUser: Meteor.user(),
  };
}, App);

但是当我看到页面加载时会发生什么时,我会看到这种行为:

第一次调用componentWillReceiveProps:

currentuser:
  _id : "DNFNaecyNWGMe4HrZ"
  emails : Array[1]
  roles : Array[1] /* SOMETIMES present, sometimes not! */

仍在加载页面,随后调用componentWillReceiveProps:

currentuser:
  _id : "DNFNaecyNWGMe4HrZ"
  emails : Array[1]
  roles : Array[1]
  lastViewedScenarios_id :MongoID.ObjectID /* Never present until 2nd call! */

什么?我正在使用alanning:roles,也许他们正在进行自己的userData自定义发布。无论这是否是一个因素,我的自定义字段lastViewedScenarios_id仅在当前用户的初始填充之后显示,即使这些数据都在同一个Mongo集合中。

我的代码需要对当前用户数据的初始化采取措施,并且这个"一次初始化一个位"行为使得清洁逻辑不可能在这里。为什么会发生这种情况,除了为每个字段的存在添加大量丑陋的初始化和测试之外,我能做些什么吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在组件调用componentWillReceiveProps时,确保数据完全可用的最安全方法是仅在userData订阅准备就绪时使用您的组件。这可以通过更改AppContainer

来实现
export default AppContainer = createContainer(() => {
  const subscriptionHandler = Meteor.subscribe('userData');
  return {
    loading: !subscriptionHandler.ready()
    currentUser: Meteor.user(),
  };
}, App);

然后在App组件中,您可以使用loading道具来决定仅在loading为假时使用该组件。

像这样的东西(在你的应用程序的render()方法中):

{
  this.props.loading ? 
    <div>Loading...</div> :
    <CleanLogicComponent user=this.props.currentUser />
}

然后,当CleanLogicComponent的{​​{1}}被调用时,所有用户数据都将可用。