我有一个自定义字段"显示晚了"与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集合中。
我的代码需要对当前用户数据的初始化采取措施,并且这个"一次初始化一个位"行为使得清洁逻辑不可能在这里。为什么会发生这种情况,除了为每个字段的存在添加大量丑陋的初始化和测试之外,我能做些什么吗?
谢谢!
答案 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}}被调用时,所有用户数据都将可用。