传递空格键的当前值:这作为meteor / blaze中新助手的参数

时间:2017-06-30 01:11:54

标签: javascript meteor meteor-blaze spacebars

我在Mongo集合中找到了多年的独特实例,并将它们作为列表项传递给我的模板。在这些我想要的子列表中,在给定年份中具有独特的月份出现次数,但我无法弄清楚如何将年份传递给我的month()助手,以便我可以限制查询。

HTML是......

        <template name="list">
          <ul>
            {{#each year}}
                <li>
                    <h2>{{this}}</h2>
                </li>
                <ul>
                    {{#each month}}
                        <li>
                            <h3>{{this}}</h3>
                        </li>
                    {{/each}}
                </ul>
              {{/each}}
          </ul>
        </template>

JS就是......

  let monthNames = ["January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"
  ];

  let findYears = function(){
    var distinctYears = _.uniq(Events.find({}, {
      sort: {start: 1}, fields: {start: true}
    }).fetch().map(function(x) {
      var d = new Date(x.start);
      return d.getFullYear();
    }), true);
    return distinctYears;
  };

  let findMonths = function(){
    var distinctMonths = _.uniq(Events.find({}, {
      sort: {start: 1}, fields: {start: true}
    }).fetch().map(function(x) {
      var d = new Date(x.start);
        return monthNames[d.getMonth()];    
    }), true);
    return distinctMonths;
  };

  Template.list.onCreated( () => {
    let template = Template.instance();
    template.subscribe( 'events' );
  });

  Template.list.helpers({
    year() {
      foundYears = findYears();
      return foundYears;
    },
    month() {
      foundMonthNames = findMonths();
      return foundMonthNames;
    }
  });

我希望能够将我的year()帮助器当前的年份作为我的month()帮助器的参数传递,以便我可以编辑我的findMonths函数,将其查询限制为仅包含在其中的事件一年,但我不知道如何做到这一点,也不知道如何从客户端查询MongoDB一个月(我所有的活动日期都是ISODate格式)。

我希望我的问题很明确。我道歉,我知道我可能使用了不正确的术语。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您有两个问题 - 将year传递到month帮助程序,并使用该参数使您的查询更具体 - 是吗?

要将year传递给帮助程序,请按照{{#each thing in things}}约定更改代码(解释为here)。因此,您的模板代码将变为:

<template name="list">
  <ul>
    {{#each year in getYears}}
      <li>
        <h2>{{year}}</h2>
      </li>
       <ul>
         {{#each month in (getMonths year)}}
           <li>
             <h3>{{month}}</h3>
           </li>
         {{/each}}
       </ul>
     {{/each}}
   </ul>
 </template>

然后你的year助手将保持不变(除非我更改了名称以使其更清楚!),并且你的month助手会接受这个论点:

Template.list.helpers({
    getYears() {
      foundYears = findYears();
      return foundYears;
    },
    getMonths(year) {
      foundMonthNames = findMonths(year);
      return foundMonthNames;
    }
  });

最后,您的findMonths功能。可能有一种不同/更简单的方式,但你可以通过比较早期和晚期日期(即大于上一年的12月31日而不是明年的1月1日来获得年份:

let findMonths = function(year){
    var query = {
      start: {
        $gt: new Date(year - 1, 11, 31),
        $lt: new Date(year + 1, 0, 1)
      }
    }
    var distinctMonths = _.uniq(Events.find(query, {
      sort: {start: 1}, fields: {start: true}
    }).fetch().map(function(x) {
      var d = new Date(x.start);
        return monthNames[d.getMonth()];    
    }), true);
    return distinctMonths;
  };

(如果您希望在午夜前到达,可以添加小时,分钟和毫秒)