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