4

我正在尝试Meteor.call在 Handlebars 块助手中使用一个函数

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,它工作正常。我在这里做错了什么?Meteor.call或者在 Handlebars 块中使用 a 是不正确的?

4

1 回答 1

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>');
    }
});

当您可以在一个批量请求中请求数据时,还要小心尝试Meteor.call为每个 profileId 和 name 使用 have so many (如果您在某种列表或其他东西中使用它)。

哈克方式

您仍然可以按照您的意愿进行操作,但我建议您不要这样做。我认为它有点低效。

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..."
     }
});
于 2013-03-03T14:40:50.463 回答