避免在流星模板助手中重复查询

时间:2015-11-02 20:01:37

标签: meteor

我开始在项目中使用meteor,而且有几个概念对我来说很难从angular + php中获得。

我试图处理两个帮助程序,用于显示表中的记录列表,基于我存储在会话变量中的日期范围。我的模板看起来像这样,我使用一个名为noRecords的助手和另一个叫做记录的记录,记录存储实际的文档集,而在noRecords中我试图存储为布尔值,记录文档集是否为空或不。

    div(class='col-md-8 col-md-offset-2')
        if noRecords
            p There are no records for the selected date 
        else
            table(class='table table-bordered')
                thead
                    tr  
                        td Id
                        td Name

                tbody
                    each records
                        +record

不幸的是,我无法在不重复查询的情况下同时设置记录和noRecords,在我的javascript代码中,这些帮助程序现在定义如下:

records : function(){
    var startDate = Session.get('searchDate').setHours(0,0,0,0);
    var endDate = Session.get('searchDate').setHours(23,59,59,999);
    var matches = Records.find(
                    {date : { 
                                $gte : new Date(startDate),
                                $lte : new Date(endDate)
                            }
                    });
    return records;
},

noRecords : function(){
    var startDate = Session.get('searchDate').setHours(0,0,0,0);
    var endDate = Session.get('searchDate').setHours(23,59,59,999);
    var matches = Records.find(
                    {date : { 
                                $gte : new Date(startDate),
                                $lte : new Date(endDate)
                            }
                    });
    return records.count() === 0;
}

日期会话变量由事件设置。

我想必须有一个更好的方法来做这个而不是执行两次查询,我尝试过使用反应变量,但我没有运气,因为我不能让反应变量更新时minimongo查询执行。

有没有办法在不运行两个查询的情况下实现这一目标?

2 个答案:

答案 0 :(得分:2)

如果你在多个帮助器中重复相同的逻辑,一个解决方案是将它们减少为一个帮助器并从中返回一个对象,例如:

records : function(){
    var startDate = Session.get('searchDate').setHours(0,0,0,0);
    var endDate = Session.get('searchDate').setHours(23,59,59,999);
    var cursor = Records.find(
                    {date : { 
                                $gte : new Date(startDate),
                                $lte : new Date(endDate)
                            }
                    });
    return {
      cursor: cursor,
      empty: cursor.count() === 0,
      one: cursor.count() === 1
    }
}

在你的模板中:

if records.one
  p Found One!

愚蠢的例子,但它可以更广泛地使用。

请注意,在您的示例中,您实际上不需要noRecords帮助器,因为您的模板可以检查空游标:

each records
  p date
else
  p No records!

答案 1 :(得分:0)

如果您使用的是Blaze,则只能使用{{#each records}}...{{else}}...{{/each}}帮助records

<template name="myTemplate">
  <div class='col-md-8 col-md-offset-2'>

  {{#each records}}{{> showRecord}}

  {{else}}<p>There are no records for the selected date</p>

  {{/each}}

  </div>
</template>

您也可以使用{{#if records}}...{{else}}...{{/if}},因为each会迭代records光标中的每个项目

<template name="myTemplate">
  <div class='col-md-8 col-md-offset-2'>

  {{#if records}}

     <table class='table table-bordered'>

     <thead>
       <tr>  
           <td>Id</td>
           <td>Name</td>
        </tr>
      </thead>

      <tbody>
      {{#each}}{{> showRecord}}{{/each}}
      </tbody>

      </table>

  {{else}}<p>There are no records for the selected date</p>

  {{/with}}

  </div>
</template>