来自Handlebars块助手的Meteor.call

时间:2013-03-03 13:00:51

标签: meteor

我正在尝试在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是不正确的?

1 个答案:

答案 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..."
     }
});