我正在从服务器发布数据,并使用withTracker进行捕获。
export default withTracker(() => {
let towndatasub = Meteor.subscribe("userTownDataPublisher",Meteor.userId());
let resourcedatasub = Meteor.subscribe("userResourcePublisher",Meteor.userId());
return{
townData : Towns.find({"ownerId":Meteor.userId()}).fetch(),
resourceData : Resources.find({"ownerId":Meteor.userId()}).fetch()
}
})(TownPage);
问题是我想在TownData和resourceData到达时运行一个函数。如果我在componentDidMount中调用updateResources,则会在this.props.componentWillReceive道具上获得未定义的内容,而该道具未称为.townData和this.props.resourceData
updateResources = () =>{
Meteor.call("updateUserResources",Meteor.userId(),(err,result)=>{
if(err){
console.log(err)
}else{
console.log("asdasd");
//console.log(this.props.resourceData); undefined
// here i will do something with this.props.resourceData
}
})
}
所以我应该在哪里调用updateResources函数以获取未定义的信息?
答案 0 :(得分:2)
首先,componentDidMount
仅在加载页面时被调用一次,紧接在对render
的第一次调用之后。因此,您不应该在那里呼叫updateResources
,因为到那时集合可能还没有完成从服务器的加载。我建议在render
中调用它,因为render
在数据到达之前将被调用一次,在数据到达之后将被调用一次。
第二,如果您想更准确地知道数据何时到达,则可以在withTracker
中返回另外两个涉及ready
函数的属性,
export default withTracker(() => {
let towndatasub = Meteor.subscribe("userTownDataPublisher",Meteor.userId());
let resourcedatasub = Meteor.subscribe("userResourcePublisher",Meteor.userId());
return{
townData : Towns.find({"ownerId":Meteor.userId()}).fetch(),
resourceData : Resources.find({"ownerId":Meteor.userId()}).fetch(),
townsReady : towndatasub.ready(),
resourcesReady : resourcedatasub.ready()
}
})(TownPage);
然后在渲染中,仅当数据到达时才可以调用updateResources
if(this.props.townsReady && this.props.resourcesReady) {
this.updateResources();
}