2013-05-01 6 views
6

Pourquoi dans l'exemple de base suivant, la collection retournée dans la fonction rendue est vide?
Autopublish est activé. Après le chargement de la page d'appel commande
Coll.find().fetch() l'intérieur javascript revient console est-elle correcte des entréesMeteor template.rendered - Pourquoi la collection est vide?

Voici le code

t.js

Coll = new Meteor.Collection("coll"); 

if (Meteor.isClient) { 
    Template.tpl.rendered = function(){ 
    console.log(Coll.find().fetch()); // <-- This line prints empty array 
    }; 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
     if (Coll.find().count() === 0) { 
      var f = ["foo","bar"]; 
      for (var i = 0; i < f.length; i++) 
       Coll.insert({f: f[i]}); 
     } 
    }); 
} 

Et t.html fichier

<head> 
    <title>test</title> 
</head> 

<body> 
    {{> tpl}} 
</body> 

<template name="tpl"> 
    Test tpl 
</template> 
+0

C'est parce que votre collection n'est pas encore chargée. 'Template.rendered' est renvoyé, cela ne signifie pas que votre collection est chargée. cochez [this] (http://stackoverflow.com/questions/15129827/) thread. –

Répondre

5

Meteor est construit hors d'un structu de type de données sur le fil ré. Cela signifie que lorsque l'application charge initialement le code HTML & JS est envoyé en premier et les données plus tard.

Vous devez utiliser la réactivité pour vérifier les modifications de données ou vérifier si l'abonnement à une collection est terminé (ce qui implique la suppression du package autopublish). (Vous pouvez vérifier comment déplacer votre application à un abonnement manuel aux docs: http://docs.meteor.com/#publishandsubscribe)

Le rappel d'abonnement vous indique quand les données sont renvoyées:

Meteor.subscribe("coll", function() { 
    //Data subscription complete. All data is downloaded 
}); 

Un modèle peut également être fait réactive (comme la façon dont vous le faites) mais .rendered n'est pas appelé parce que Meteor vérifie d'abord si le code HTML d'un modèle a changé seulement s'il est différent va-t-il changer son code HTML et appeler le rappel rendu.

Qu'est-ce que vous avez en option ici est à 1) au lieu d'utiliser Deps.autorun ou

2) Je ne sais pas pourquoi vous utilisez dans votre rappel rendu, mais s'il est nécessaire de le mettre là, vous Vous devez vous assurer que le code HTML du modèle change, en introduisant quelque chose dans le code HTML de votre collection qui le fait changer lorsque les nouvelles données sont introduites.

+0

Je suis coincé ici aussi. Pouvez-vous élaborer sur ce sujet? J'essaye de rendre manuellement un gabarit qui génère un diagramme de c3 js et j'essaye de charger des données de la base de données mais obtenant le tableau vide comme ci-dessus. – radtek

+0

@radtek Meteor fonctionne en envoyant d'abord le code HTML, puis les données plus tard. Lorsque le rappel effectué se déclenche, les données peuvent ne pas avoir été ou peuvent avoir été envoyées. Vous devez donc faire en sorte que vous attendiez qu'il arrive en utilisant l'une des méthodes ci-dessus ou la commande 'subscribe ('..'). Wait()' du routeur de fer avant de dessiner votre graphique. – Akshat

+0

Ouais, je sais. Je suppose que ce que je suis après est un exemple du paquet c3 js météore en cours d'utilisation. Fonctionne très bien avec les données statiques, mais il devrait y avoir un exemple de meilleure pratique pour travailler avec les données DB. Je verrai ce que je trouverai plus tard ce soir. Quand j'ai essayé de rendre le html puis de m'abonner et de sortir les données via le guidon, j'ai essayé de générer un script js à l'intérieur du template mais les guidons créaient une nouvelle ligne quand j'en faisais une pour chaque js. var data = []; data.push ({{each_item}}); . Alors je pensais que c'était trop hacky et il devait y avoir un meilleur moyen – radtek

Questions connexes