流星订阅 - 自定义帮助程序功能不起作用

时间:2014-03-17 05:40:22

标签: mongodb meteor publish-subscribe

当我在客户端订阅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查询子集?我有什么东西在这里失踪吗?感谢您的帮助。

1 个答案:

答案 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)块就会运行封装函数。