web-dev-qa-db-ja.com

Meteor Publish / Subscribeについて

Projectsのリストを表示する簡単なアプリをセットアップしました。クライアントにすべてを送信しないように、autopublishパッケージを削除しました。

_ <template name="projectsIndex">    
   {{#each projects}}      
     {{name}}
   {{/each}}
 </template>
_

autopublishをオンにすると、すべてのプロジェクトが表示されます。

_if Meteor.isClient
  Template.projectsIndex.projects = Projects.find()
_

それが削除されたら、私はさらに行う必要があります:

_ if Meteor.isServer
   Meteor.publish "projects", ->
     Projects.find()
 if Meteor.isClient
   Meteor.subscribe "projects"
   Template.projectsIndex.projects = Projects.find()
_

クライアント側のfind()メソッドは、サーバー側から発行されたレコードのみを検索すると言うのは正確ですか? find()を1回だけ呼び出すべきだと感じたため、つまずきました。

84
DVG

はい、クライアント側のfind()は、Minimongoのクライアント上にあるドキュメントのみを返します。 docs から:

クライアントで、Minimongoインスタンスが作成されます。 Minimongoは本質的に、純粋なJavaScriptでのMongoのメモリ内の非永続的な実装です。このクライアントが使用しているデータベースのサブセットのみを保存するローカルキャッシュとして機能します。クライアント(検索)のクエリは、サーバーと通信せずに、このキャッシュから直接提供されます。

あなたが言うように、publish()はクライアントが持つドキュメントを指定します。

27
user728291

ここでの基本的な経験則は、publishsubscribedの変数名は、クライアント側とサーバー側で同じでなければなりません。

Mongo DBとクライアント側のコレクション名は同じでなければなりません。

employeesという名前のコレクションに対してパブリッシュとサブスクライブを使用していると仮定すると、コードは次のようになります


サーバ側

ここで、varキーワードの使用はオプションです(このキーワードを使用して、コレクションをこのファイルに対してローカルにします)。

CollectionNameOnServerSide = new Mongo.Collection('employees');   

Meteor.publish('employeesPubSub', function() { 
    return CollectionNameOnServerSide.find({});     
});

クライアント側の.jsファイル

CollectionNameOnClientSide = new Mongo.Collection('employees');
var employeesData = Meteor.subscribe('employeesPubSub');

Template.templateName.helpers({
  'subcribedDataNotAvailable' : function(){
        return !employeesData.ready();
    },
   'employeeNumbers' : () =>{
       CollectionNameOnClientSide.find({'empId':1});
  }
});

クライアント側の.htmlファイル

ここでは、subcribedDataNotAvailableヘルパーメソッドを使用して、クライアント側でデータの準備ができているかどうかを確認できます。データの準備ができたら、employeeNumbersヘルパーメソッドを使用して従業員番号を出力します。

<TEMPLATE name="templateName">
{{#if subcribedDataNotAvailable}}
   <h1> data loading ... </h1>
 {{else}}
  {{#each employeeNumbers }}
     {{this}}
  {{/each}}
 {{/if}}
<TEMPLATE>
1
Puneeth Reddy V
// on the server
Meteor.publish('posts', function() {

    return Posts.find();

});

// on the client
Meteor.subscribe('posts');
0
Shemeer M Ali