我正在尝试在Handlebars块助手中使用Meteor.call
函数
Handlebars.registerHelper('get_handle', function(profileId, name) {
Meteor.call("getProfileLink", profileId, function(error, result) {
if (error) {
return new Handlebars.SafeString('<a href="#">' + name + '</a>');
} else {
return new Handlebars.SafeString('<a href="http://twitter.com/' + result + '">' + name + '</a>');
}
});
});
我在console.log(result)
中看到返回的结果,但是没有呈现此助手的HTML。但是,当我从Handlebars.SafeString
中添加相同的Meteor.call
返回值时,它可以正常工作。我在这做错了什么?或者在Handlebars块中使用Meteor.call
是不正确的?
答案 0 :(得分:4)
你不能在带有上述范例的把手块中使用Meteor.call,主要是因为javascript的异步设计,当从服务器接收到值时,返回值已经被返回。
然而,您可以使用Session
变量传递它:
Handlebars.registerHelper('get_handle', profileId, name, function() {
return new Handlebars.SafeString(Session.get("get_handle" + profileId + "_" + name));
});
//In a meteor.startup or a template.render
Meteor.call("getProfileLink", profileId, name, function(error, result) {
if (error) {
Session.set("get_handle" + profileId + "_" + name, '<a href="#">' + name + '</a>');
} else {
Session.set("get_handle" + profileId + "_" + name, '<a href="http://twitter.com/' + result + '">' + name + '</a>');
}
});
当你可以在一个批量请求中请求数据时,还要小心尝试使用每个profileId和名称有很多Meteor.call
(如果你在某种列表或其他东西中使用它)。 / p>
Hacky way
您仍然可以按照预期的方式进行,但我会建议不要这样做。我认为它有点低效。
Handlebars.registerHelper('get_handle', profileId, name, function() {
if(Session.get("get_handle" + profileId + "_" + name)) {
return new Handlebars.SafeString(Session.get("get_handle" + profileId + "_" + name));
}
else
{
Meteor.call("getProfileLink", profileId, name, function(error, result) {
if (error) {
Session.set("get_handle" + profileId + "_" + name, '<a href="#">' + name + '</a>');
} else {
Session.set("get_handle" + profileId + "_" + name, '<a href="http://twitter.com/' + result + '">' + name + '</a>');
}
});
return "Loading..."
}
});