我在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
...
...
答案 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
[]
]