2017-05-16 4 views
1

änderte ich blaze Vorlage haben für Stadt beliebte Orte Namen Auflistung:aktualisieren Meteor Vorlage, wenn Daten

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

und Helfer aus, wo ich versuche Orte Daten von Googlemaps für eine Vorlage zu erhalten:

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; 
      }); 
     } 
    } 
}) 

Aber Es funktioniert nicht, da die Vorlage vor dem Helper-Array mit Daten gerendert wurde. Was sollte ich tun, um Helper reagierende Daten reaktiv zu machen und diese Daten in Vorlage anzuzeigen?

Antwort

3

Verwenden Sie den onRendered Haken Ergebnisse an eine reaktive Variable auf der Vorlageninstanz zuweisen:

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); 
    } 
}); 

Von dort aus ist es nur eine Frage der reaktiven Variable aus dem Helfer Rückkehr:

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

Sie In diesem Fall brauchen Sie nicht einmal zu warten, bis die Template-Instanz gerendert wird. "onCreated" ist gut genug. – ghybs

+0

Richtig, 'OnCreated' funktioniert auch, aber ich wollte das Wasser nicht mit einer Erklärung von' onCreated' v 'onRendered' verwässern. –

Verwandte Themen