当我在客户端订阅mongodb集合并在交换机自动发布时在服务器中发布。我是否需要指定我在发布方法中的助手函数中声明的每个查找查询?或者只是在Publish语句中返回Meteor.collection.find()并且应该可以访问整个集合吗?
失去了什么?请参阅下文
在我的应用程序中,我有2个mongo集合设置。一个被称为“桌子'另一个叫做劳斯'。
在我的client.js文件中,我有两个把手辅助函数:
Template.tables.tableList = function(){
return Tables.find();
}
Template.tableBox.table = function(tableID){
return Rolls.find({"Roll.tableName": tableID}, {sort: {date: -1}, limit:10});
}
对应我的模板:
<template name="tables">
<div class="table-area">
{{#each tableList}}
{{> tableBox}}
{{/each}}
</div>
</template>
<template name="tableBox">
<table id="{{name}}" class="table table-condensed">
<tr class="n{{minBet}}">
<th>{{name}}</th>
<th> Min:</th>
<th>{{minBet}}</th>
<th>{{cPlayers}}</th>
</tr>
<tr>
<td>D1</td>
<td>D2</td>
<td>D3</td>
<td>Tot</td>
</tr>
{{#each table name}}
{{> tableRow}}
{{/each}}
</table>
</template>
<template name="tableRow">
<tr class={{rowColor Roll.dice1 Roll.dice2 Roll.dice3 Roll.total}} "bold">
<td>{{Roll.dice1}}</td>
<td>{{Roll.dice2}}</td>
<td>{{Roll.dice3}}</td>
<td>{{Roll.total}}</td>
</tr>
</template>
第一个辅助函数返回集合中的所有表。 第二个按降序返回最后10个卷。
使用自动发布 - 一切正常。我的页面显示了所有表格,并在每个表格中显示了最后10个dicerolls。
当我关闭自动发布并尝试设置相应的订阅/发布语句时。它不起作用。只显示了表格 - 但是Rolls集合中的数据没有填充我的模板。
相应的订阅和发布代码:
在client.js中:
Meteor.subscribe('tables');
Meteor.subscribe('rolls');
在server / publications.js中:
Meteor.publish('tables', function() {
return Tables.find();
});
Meteor.publish('rolls', function() {
return Rolls.find();
});
我的假设是我的把手帮助函数中的稍微复杂的查询与roll表有关吗?是不是简单的订阅整个集合(即发布Rolls.find()的返回),然后能够访问我在客户端中定义的所有mongo查询子集?我有什么东西在这里失踪吗?感谢您的帮助。
答案 0 :(得分:1)
这似乎是因为Rolls集合在您查询它时尚未在客户端上完全加载。您可以尝试以下方式:
Template.tables.tableList = function(){
return Tables.find();
}
Template.tableBox.table = function(tableID){
Deps.autorun(function () {
return Rolls.find({"Roll.tableName": tableID}, {sort: {date: -1}, limit:10});
});
}
只要反应依赖项发生变化,Deps.autorun(func)
块就会运行封装函数。