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回だけ呼び出すべきだと感じたため、つまずきました。
はい、クライアント側のfind()は、Minimongoのクライアント上にあるドキュメントのみを返します。 docs から:
クライアントで、Minimongoインスタンスが作成されます。 Minimongoは本質的に、純粋なJavaScriptでのMongoのメモリ内の非永続的な実装です。このクライアントが使用しているデータベースのサブセットのみを保存するローカルキャッシュとして機能します。クライアント(検索)のクエリは、サーバーと通信せずに、このキャッシュから直接提供されます。
あなたが言うように、publish()はクライアントが持つドキュメントを指定します。
ここでの基本的な経験則は、publish
とsubscribed
の変数名は、クライアント側とサーバー側で同じでなければなりません。
Mongo DBとクライアント側のコレクション名は同じでなければなりません。
employees
という名前のコレクションに対してパブリッシュとサブスクライブを使用していると仮定すると、コードは次のようになります
ここで、var
キーワードの使用はオプションです(このキーワードを使用して、コレクションをこのファイルに対してローカルにします)。
CollectionNameOnServerSide = new Mongo.Collection('employees');
Meteor.publish('employeesPubSub', function() {
return CollectionNameOnServerSide.find({});
});
CollectionNameOnClientSide = new Mongo.Collection('employees');
var employeesData = Meteor.subscribe('employeesPubSub');
Template.templateName.helpers({
'subcribedDataNotAvailable' : function(){
return !employeesData.ready();
},
'employeeNumbers' : () =>{
CollectionNameOnClientSide.find({'empId':1});
}
});
ここでは、subcribedDataNotAvailable
ヘルパーメソッドを使用して、クライアント側でデータの準備ができているかどうかを確認できます。データの準備ができたら、employeeNumbers
ヘルパーメソッドを使用して従業員番号を出力します。
<TEMPLATE name="templateName">
{{#if subcribedDataNotAvailable}}
<h1> data loading ... </h1>
{{else}}
{{#each employeeNumbers }}
{{this}}
{{/each}}
{{/if}}
<TEMPLATE>
// on the server
Meteor.publish('posts', function() {
return Posts.find();
});
// on the client
Meteor.subscribe('posts');