2

私はおそらくここで私の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」ステートメントが実行されることです。そうですか?それともスコーピングの問題ですか?テンプレートから「呼び出し」を呼び出して、このようにすることもできますか?

ここでメソッドを使用している理由は、Messagesコレクションが膨大になる可能性があり、クライアントで全体としてサブスクライブできないためです。その一部のサブスクリプションがありますが、サブスクリプションが何であるかに関係なく、任意のメッセージを検索する必要もあります。

4

2 に答える 2

3

を調べたときに、コールバックがまだ設定されていないことについては正しいですmsgSessionコールバックが戻ったときに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)");
    });
  }
};

一方、「現在のメッセージ」を取得するために単一メッセージのサブスクリプションを使用することは、より理にかなっており、より慣用的であると私はおそらく言うでしょう。

于 2012-10-08T01:47:34.050 に答える
1

「call」メソッドに渡される3番目のパラメーターは非同期コールバックです。「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
});
于 2012-10-06T22:11:03.587 に答える