4

Meteor.callHandlebarsブロックヘルパー内の関数を使用しようとしています

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ブロックでを使用するのは正しくありませんか?

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

また、1回の一括リクエストでデータをリクエストできる場合は、profileIdと名前ごとに非常に多くのデータを使用するように注意してMeteor.callください(これをある種のリストなどで使用している場合)。

ハッキーな方法

あなたはまだあなたが意図するようにそれをすることができます、しかし私はそれに対して忠告します。少し非効率だと思います。

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 に答える