2013-05-01 33 views
6

Aşağıdaki temel örnekte neden iadeli toplama işlevi boş olarak döndürülür?
Otomatik çeviri etkin. JavaScript konsolu getiri iç komutu
Coll.find().fetch() çağıran sayfa yüklendikten sonra girdileri İşte Meteor template.rendered - Neden koleksiyon boş?

kümesi doğru kod

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

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

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

Çünkü koleksiyonunuz henüz yüklenmemiş. "Template.rendered", kovuldu, koleksiyonunuzun yüklü olduğu anlamına gelmez. [bu] 'yu kontrol edin (http://stackoverflow.com/questions/15129827/). –

cevap

5

Meteor inşa edilmiştir

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

Ve t.html dosyasıdır bir veri-on-tel tipi structu kapalı yeniden. Bu, uygulamanın başlangıçta HTML & JS'yi yüklediğinde önce ve daha sonra verileri gönderdiği anlamına gelir. bir koleksiyona abonelik (autopublish paketini çıkarmadan gerektirir olan) tamamlandığında

Veri değişiklikleri kontrol veya kontrol etmek reaktiviteyi kullanmak zorunda. veri döndürüldüğünde abonelik geri arama anlatır

:

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

bir şablon da reaktif hale getirilebilir (: (http://docs.meteor.com/#publishandsubscribe Sen docs manuel bir aboneliğe uygulamayı taşımak nasıl kontrol edebilirsiniz) yol gibi yapıyorsun) fakat Meteor öncelikle onun hTML değiştirmek ve oluşturulan geri arama arayacak farklı olması halinde bir şablonun html & değişti olmadığını denetler çünkü .rendered isnt çağrıldığını. siz) bir seçenek burada 1'e olduğu gibi olduğundan bunun yerine Deps.autorun kullanmak ne

veya

2) Eğer render geri aramasında bu kullandığınız neden emin değilim ama gerekirse orada koymak şablonun HTML'sinin değiştiğinden emin olmanız gerekir. Böylece, koleksiyonunuzdaki html'ye yeni veriler eklendiğinde bunu değiştirecek bir şey eklenir.

+0

Ben de burada sıkıştım. Bunu detaylandırır mısın? El ile bir c3 js grafiği oluşturan bir şablon oluşturmaya çalışıyorum ve veriyi veritabanından yüklemeye çalışıyorum ama boş diziyi yukarıdaki gibi alıyorum. – radtek

+0

@radtek Meteor, önce html'yi, sonra verileri daha sonra göndererek çalışır. İşlenen geri arama işleminiz başladığında, veriler gönderilmeyebilir veya gönderilmemiş olabilir. Yukarıdaki yöntemleri veya demir yönlendiricinin 'subscribe ('..') birini kullanarak gelmesini beklediğinizden emin olmak için bir şey yapmalısınız. – Akshat

+0

Evet, bildiğim kadarıyla. Sanırım ne olduğum, kullanılan c3 js meteor paketinin bir örneğidir. Statik verilerle iyi çalışır ancak db verileriyle çalışmak için en iyi uygulama örneği olmalıdır. Bu gece daha sonra ne bulduğumu göreceğim. Html'yi oluşturmaya çalıştığımda, abone olun ve verileri gidonlar aracılığıyla belirlediğimde, şablonun kendisinde bir js komut dosyası oluşturmaya çalıştım ancak her biri için yaptığım zaman gidonlar yeni bir satır oluşturacaktı, böylece parseable j'ler bile yoktu. var veri = []; data.push ({{each_item}}); . Ondan sonra bu yol çok hacky olduğu düşünülmüş ve daha iyi bir yolu – radtek