Template.prototype.autorun()在循环内不起作用

时间:2015-06-11 21:09:56

标签: meteor

我在Template.prototype.onRendered()中使用Template.prototype.autorun()来反应性地更新模板。我想要多个autoruns,所以只有具有更新数据的部分再次运行。以下是我的想象:

...
for d in [0..6]
  @autorun ->
    console.log d
    deplanements = [ 'deplanements' ]
    for h in [0..23]
      deplanements[h + 1] = 0
      Flights.find(
        eibt:
          $gte: new Date(
            weekStart.year(), weekStart.month(), weekStart.date() + d, h
          )
          $lt: new Date(
            weekStart.year(), weekStart.month(), weekStart.date() + d, h + 1
          )
      ).forEach (flight) ->
        deplanements[h + 1] += flight.passengers
      charts[d].load columns: [
        xLabels
        deplanements
        []
      ]

首次渲染它工作正常,在控制台中我看到0,1 ... 6,模板看起来像预期的那样。但是,当我修改集合时,d打印为7.我不明白这是怎么回事。如果我手动展开循环,它可以正常工作:

...
@autorun ->
  d = 0
  console.log d
  ...
@autorun ->
  d = 1
  console.log d
  ...
...

1 个答案:

答案 0 :(得分:1)

可能每个自动运行中引用的d索引是相同的,因此在for循环之后,d最终等于7.它显然是一个常见的陷阱。一个简单的解决方法是call a self-invoking function within your for loop

...
for d in [0..6]
  do (d) ->
    Template.instance().autorun ->
      console.log d
      deplanements = [ 'deplanements' ]
      for h in [0..23]
        deplanements[h + 1] = 0
        Flights.find(
          eibt:
            $gte: new Date(
              weekStart.year(), weekStart.month(), weekStart.date() + d, h
            )
            $lt: new Date(
              weekStart.year(), weekStart.month(), weekStart.date() + d, h + 1
            )
        ).forEach (flight) ->
          deplanements[h + 1] += flight.passengers
        charts[d].load columns: [
          xLabels
          deplanements
          []
        ]