1

そこで、publishComposite を使用して、Meteor でコレクションを結合しました。user_id 外部キーを持つ親コレクション (サブスクリプション) があります。Meteor.users コレクションでユーザー名を検索して実際のユーザー名を取得しますが、これを実際に html テンプレートに出力するにはどうすればよいですか。サブスクリプション データはありますが、ユーザー名を実際に参照するにはどうすればよいですか?

パブリッシュコードは次のとおりです。

//publish subscriptions course view
Meteor.publishComposite('adminCourseSubscriptions', function(courseId){
  return {
    //get the subs for the selected course
    find: function(){
        return Subscriptions.find(
            {course_id: courseId}
        );
    },

    children: 
    [
        {   
            //get the subscriber details for the course
            find: function(sub){
                return Meteor.users.find({_id:sub.user_id});
            }

        }

    ]
  };

});

テンプレートのサブスクリプトは次のとおりです。

Template.adminCourseDetail.helpers({
  courseDetail: function(id){
    var id = FlowRouter.getParam('id');
    return Courses.findOne({ _id: id });
  },
  courseSubscriptions: function(){
    var id = FlowRouter.getParam('id');
    return Subscriptions.find({course_id:id})
  },
  users: function(){
    return Meteor.users.find();
  }
});

テンプレート(ガベージ) ps コースの詳細は別のコレクションから取得されます。詳細を個別に取得する方が簡単で、パフォーマンスが向上したと思います。これはうまく機能します。正しく表示できないのはユーザー名だけです。

<template name="adminCourseDetail">
<h1>Course Details</h1>
<p>Title: {{courseDetail.title}}</p>
<p>Description: {{courseDetail.description}}</p>
<p>Start Date: {{courseDetail.startDate}}</p>
<p>Number of sessions: {{courseDetail.sessions}}</p>
<p>Duration: {{courseDetail.duration}}</p>
<p>Price: {{courseDetail.price}}</p>
<p>{{userTest}}</p>
<a href="#">edit</a>
<a href="#">delete</a>
<h2>Course Subscriptions</h2>
{{#each courseSubscriptions}}
    <div class="row">
        <div class="col-md-3">{{username}}</div>
        <div class="col-md-3">{{sub_date}}</div>
    </div>
{{/each}}
</template>

提案をお寄せいただきありがとうございます。

4

2 に答える 2

1

あなたの質問を理解する限り、コレクションのドキュメントには、コレクション内の対応するユーザードキュメントを参照するSubscriptions属性のみが含まれています。この場合、ユーザー名を返す追加のテンプレート ヘルパーを追加する必要があります。user_idMeteor.users

Template.adminCourseDetail.helpers({
  // ...
  getUsername: function() {
      if (this.user_id) {
        let user = Meteor.users.find({
          _id: this.user_id
        });
        return user && user.username;
      }
      return "Anonymous";
    }
  // ...
});

その後、次のように置き換え{{username}}ます{{getUsername}}

<template name="adminCourseDetail">
   <!-- ... -->
   <h2>Course Subscriptions</h2>
   {{#each courseSubscriptions}}
      <div class="row">
         <div class="col-md-3">{{getUsername}}</div>
         <div class="col-md-3">{{sub_date}}</div>
      </div>
   {{/each}}
   <!-- ... -->
</template>

reywood:publish-compositeパッケージの概念を誤解している可能性があります。を使用Meteor.publishComposite(...)すると、リアクティブ結合が発行されますが、結合されたデータの新しいセットは返されません。

于 2016-03-06T10:08:34.453 に答える
1

同様の問題を抱えていて、私の特定の例を見ている他の人のために。私の場合、次のコードが機能しました。マティアスの答えに基づく:

テンプレートヘルパーで:

getUsername: function() {
  let user = Meteor.users.findOne({
      _id: this.user_id
    });
  return user;
}

そして、テンプレートで:

{{getUsername.username}}

私の各ブロックは、コースコレクションではなくサブスクリプションコレクションから返されたカーソルをループしているため、Matthias が提供したコードよりも単純です。

于 2016-03-06T11:22:04.717 に答える