将 spacebars:this 的当前值作为参数传递给 meteor/blaze 中的新助手

pass current value of spacebars:this as argument to new helper in meteor/blaze

我在 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 格式)。

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

如果我理解正确,你有两个问题 - 将 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 功能。可能有一种 different/easier 方式,但您可以通过比较较早和较晚的日期(即大于上一年的 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;
  };

(如果你想在午夜之前添加小时、分钟和毫秒)