2013-05-01 12 views
6

Dlaczego w poniższym podstawowym przykładzie zwrócona kolekcja wewnątrz renderowanej funkcji jest pusta?
Autopublikowanie jest włączone. Po załadowaniu strony komendy
Coll.find().fetch() zawijających wewnątrz JavaScript zwróci konsoli poprawny zestaw wpisówMeteor template.render - Dlaczego kolekcja jest pusta?

Oto kod

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

I t.html plik

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

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

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

Dzieje się tak, ponieważ Twoja kolekcja nie jest jeszcze załadowana. Zwolnione jest 'Template.render', nie oznacza to, że twoja kolekcja jest załadowana. sprawdź wątek [this] (http://stackoverflow.com/questions/15129827/). –

Odpowiedz

5

Meteor jest zbudowana off danych-na-strukturze typu wire re. Oznacza to, że gdy aplikacja ładuje początkowo kod HTML & JS jest wysyłane jako pierwsze, a dane później.

Musisz użyć reaktywności, aby sprawdzić zmiany danych lub sprawdzić, kiedy subskrypcja kolekcji jest kompletna (co pociąga za sobą usunięcie autopublish pakiet). (Możesz sprawdzić, jak przenieść aplikację do ręcznego zapisania na docs: http://docs.meteor.com/#publishandsubscribe)

Wywołanie zwrotne subskrypcji mówi, kiedy dane są zwracane:

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

Szablon można również reaktywne (tak jak robisz), ale .rendered nie jest wywoływana, ponieważ Meteor najpierw sprawdza, czy html szablonu zmieniło się & tylko jeśli jest inny czy zmieni swój HTML i zadzwoni do renderowanego wywołania zwrotnego.

Co masz jako opcja jest tu 1) Użyj Deps.autorun zamiast lub

2) Nie jestem pewien, dlaczego używasz tego w swoim świadczonych zwrotnego, ale jeśli jest to konieczne, aby umieścić go tam cię trzeba się upewnić, że HTML szablonu zmieni się, wprowadzając coś do html z kolekcji, które zmienia się po wprowadzeniu nowych danych.

+0

Utknąłem tu także. Czy możesz to rozwinąć? Próbuję ręcznie renderować szablon, który generuje wykres c3 js i próbuję załadować dane z bazy danych, ale otrzymuję pustą tablicę jak wyżej. – radtek

+0

@radtek Meteor działa, wysyłając najpierw kod HTML, następnie dane. Po wygenerowaniu wygenerowanego wywołania zwrotnego dane mogą nie zostać wysłane lub mogły zostać wysłane. Trzeba tak coś, aby upewnić się, że czeka na przybycie za pomocą jednej z powyższych metod lub polecenia 'subscribe ('..') żelaznego routera. Wait()' zanim narysujesz wykres. – Akshat

+0

Tak wiele wiem. Myślę, że to, czego szukam, to przykład pakietu c3 js meteor w użyciu. Działa dobrze z danymi statycznymi, ale powinien istnieć przykład najlepszych praktyk do pracy z danymi bazy danych. Zobaczę, co wymyślę dziś wieczorem. Kiedy próbowałem renderować html, a następnie subskrybować i zgasić dane za pomocą kierownicy, próbowałem wygenerować skrypt js wewnątrz samego szablonu, ale kierownica tworzyłaby nową linię, gdy robiłbym dla każdego tak, że nie był nawet parsowalny js. var data = []; data.push ({{every_item}}); . Więc wtedy pomyślałem, że to jest zbyt hacky i musi być lepszy sposób – radtek

Powiązane problemy