我可能在这里显示我的javascript无知,但为什么这不起作用?我怎样才能重写这段代码才能使它工作?
// On the client
Template.tabs.title = function () {
var msg;
Meteor.call('getMessage', this.msg_id, function (error, result) {
console.log(result); // Prints out a perfectly fine message object
msg = result;
});
if (msg)
return msg.title;
else
return "(empty)"; // This is always the value that's shown on the page
};
我对该问题的理解是在回调可以设置msg变量之前执行“if”语句。是对的吗?或者这是一个范围问题?我是否可以这样做,从模板中调用“call”?
我在这里使用方法的原因是Messages集合可能很大,我不能在客户端上整体订阅它。我订阅了部分内容,但无论我的订阅是什么,我都需要查找任意消息。
答案 0 :(得分:3)
当你检查msg
时,你还没有设置回调是正确的。我想最好的办法就是在回调返回时设置一个Session
var,并依赖Meteor的反应来重新发送你的消息。类似的东西:
Template.tabs.title = function () {
var title = Session.get('currentTitle');
if (title) {
return 'title';
else {
Meteor.call('getMessage', this.msg_id, function (error, msg) {
Session.set('currentTitle', msg ? msg.title : "(empty)");
});
}
};
另一方面,我可能会说使用单一消息订阅来抓住“当前消息”会更有意义并且更具惯用性。
答案 1 :(得分:1)
为“call”方法传递的第三个参数是异步回调,当您尝试返回“msg”变量时,它尚未定义。
使用另一个回调,如下所示:
Template.tabs.retrieveTitle(callback){
Meteor.call('getMessage', this.msg_id, function (error, result) {
callback( (result) ? result.title : "(empty)" );
});
}
您可以这样使用上述方法:
Template.tabs.retrieveTitle(function(){
//do what you want to
});