我希望在网站包含要呈现的所有数据之前显示加载模板。
在服务器端方法通过Meteor.call向我提供数据(来自API [async])后,我想加载正确的布局。
我尝试了很多在Google上找到的方法,这些方法描述了相似但不完全相同的问题。包括定义具有就绪句柄的函数的方式,也不起作用。我无法让它运行。
我不想使用集合,因为这是用户特定的数据。(我认为为每个用户[没有登录用户]制作集合效率不高,或者我错过了什么)这可能吗?< / p>
这是我的代码。控制台记录2个1。
Router.route('/search/:term',{
name: 'search',
loadingTemplate: 'loading',
waitOn : function(){
var term = this.params.term;
//i think here has be something differnet either with return subscribe or function with ready-handle
Meteor.call('search',term,function(err, response) {
Session.set('shops', response);
console.log(1);
});
},
action : function(){
console.log(2);
this.render();
}
});
Template.search.helpers(
{
"shops" : function(){
return Session.get('shops');
}
}
);
服务器端方法返回一个数组。
感谢您的帮助
答案 0 :(得分:4)
铁路由器的waitOn
不会等待Meteor.call()
。相反,设置此方法的方法是subscribe
到waitOn
中的记录集,publish
包含Meteor.call()
的函数,然后创建客户端为每个用户收集集合以接收呼叫结果。它看起来如下所示:
客户端:
// create this collection only on the client
// to receive publication on a per-user basis
Search = new Mongo.Collection('search');
路线:
Router.route('/search/:term',{
waitOn : function(){
var term = this.params.term;
return Meteor.subscribe('search', term);
}
});
服务器:
Meteor.publish('search', function(term){
check(term, String);
var self = this;
Meteor.call('search', term, function(error, result){
if (result){
self.added("search", "mySearch", {results: result});
self.ready();
} else {
self.ready();
}
});
});
Meteor.methods({
search: function(term){
//do the api call and return it
}
});
我建议您查看Meteor documentation here中低级添加/更改/删除发布功能的示例。它是一个密集的部分,但最终包含了使用例工作所需的内容。