我有一个集合,其中包含我从JSON文件中带来的一些数据:Data.insert( JSON.parse(Assets.getText('data.json')) );
。我想创建一个包含JS文件中不属于模板的所有数据的var。
我应该var data = Data.find({}).fetch()[0]
吗?
有时候fetch返回为空,我得undefined
所以我猜这不是最好的方法。什么是正确的方法?
答案 0 :(得分:1)
在您拨打find
时,听起来数据并不总是存在(另外,您可以使用findOne
)。
根据您对该问题的评论,您可能希望将调用find
的函数放在Tracker.autorun()
中,以便在新数据进入时更新您的变量。如果该代码不在一个模板助手,当数据从服务器进入时,它不会重新运行。如果模板中的某些内容依赖于它,那么将它放在模板中的帮助器中可能是有意义的。
或者,如果在服务器启动后数据不会更改,那么您可以使用发布和订阅机制在服务器上加载数据ready()
后声明,然后在{{1}中进行客户端后处理你的onReady()
函数中的回调,类似于:
在服务器上:
subscribe()
在客户端:
Meteor.publish("startupData", function (){
if (!this.userId)
return this.ready();
else
return StartUpData.find({userId: this.userId});
}
此外,在后一种情况下(不变的初始数据),您需要确保在数据到达之前,任何依赖于数据的模板都不会呈现。我过去使用IronRouter的var startupData;
Meteor.subscribe("startupData", function(){
var initStartupData = StartUpData.find({}) //will get all the published data for this user
startupData = doPostProcessing(initStartupData)
}
功能处理了这个案例,如下所示:
waiton
话虽如此......如果有一个依赖于某些数据的模板,通常这表明数据应该在该模板的帮助器中提供,或者作为模板的数据上下文提供。当流量数据到达/发生变化时,Meteor将自动处理重新渲染。