如果数据更改,则更新流星模板

Update meteor template if data changed

我有城市热门地名列表的 Blaze 模板:

<template name="city">
  {{#each places}}
    {{this}}
  {{/each}}
</template>

我试图从 GoogleMaps 获取模板地点数据的助手:

Template.city.helpers({
    places: function() {
        if (GoogleMaps.loaded()) {
            var places = [];
            ...

            service.radarSearch(request, function(points) {
                points.slice(0, 8).forEach(function(point) {
                    service.getDetails({
                        placeId : point.place_id
                    }, function(details) {
                        places.push({
                            name: details.name
                        });
                    });
                });
                return places; 
            });
        }
    }
})

但它不起作用,因为在包含数据的辅助数组准备就绪之前呈现的模板。我应该怎么做才能使助手返回的数据具有反应性并在模板中显示此数据?

使用 onRendered 挂钩将结果分配给模板实例上的反应变量:

import { ReactiveVar } from 'meteor/reactive-var';
Template.city.onRendered(function() {
  const self = this;
  self.places = new ReactiveVar();
  service.radarSearch(request, function(points) {
    self.places.set(places);
  }
});

从那里开始,只需从助手返回反应变量即可:

Template.city.helpers({
  places: function() {
    const tpl = Template.instance();
    const places = tpl && tpl.places.get();
    return places || [];
  }
});