1

アプリの大まかなドラフトが完成したばかりで、自動公開モードと安全でないモードを削除する時が来たと考えました。クライアントで呼び出していたすべての不要な更新および挿入メソッドをメソッドに転送し始めました。しかし、今はID からユーザー名を返すのに問題があります。

以前の私の機能:(自動公開を削除するまでは機能していました)

challenger: function() {
  var postId = Session.get('activePost');
  var post = Posts.findOne(postId);
  if (post.challenger !== null) {
    var challenger = Meteor.users.findOne(post.challenger);
    return challenger.username;
  }
  return false;
}

今私がしようとしていること:

Template.lobby.helpers({
  challenger: function() {
    var postId = Session.get('activePost');
    var post = Posts.findOne(postId);
    if (post.challenger !== null) {
      var userId = post.challenger;
      Meteor.call('getUsername', userId, function (err, result) {
        if (err) {
          console.log(err);
        }
        return result;
      });
    }
    return false;
  },

使用:

Meteor.methods({
    getUsername: function(userId) {
        var user = Meteor.users.findOne({_id: userId});
        var username = user.username;
        return username;
    },
    ...
})

コードをブロックして、値が定義されたときにのみ値を返し、call-callback で console.logging を試みました (正しいユーザー名がコンソールに返されましたが、ビューは変更されませんでした)。

誰かが私が犯している明らかな間違いを見つけてくれることを願っています.3時間試してみましたが、値がコンソールに返されるのにテンプレートに返されない理由がわかりません.

4

1 に答える 1

4

ヘルパーは同期的に実行する必要があり、副作用があってはなりません。メソッドを呼び出してユーザーを取得する代わりに、そのルート/テンプレートに必要なユーザーが公開されていることを確認する必要があります。たとえば、ルーターは、アクティブな投稿と投稿のチャレンジャーの両方のサブスクリプションを待機できます。クライアントが必要なドキュメントを入手したら、元のコードに戻すことができます。

于 2015-02-12T19:09:28.133 に答える