2014-11-13 19 views
7
Tweets = new Meteor.Collection('tweets'); 

if (Meteor.isClient) { 

    Meteor.subscribe('tweets'); 

    Template.Panel.helpers({ 
    items: function() { 
     var days_tweets = Tweets.find(); 
     console.log(days_tweets.count()); 
     return days_tweets; 
    }); 
    } 

if (Meteor.isServer) { 
    Meteor.publish('tweets', function() { 
    return Tweets.find({}, {limit: 1000}); 
    }); 

şablonu:Meteor yardımcı değişken tek şablon tarafından birden çok kez denilen

<body> 
<h1>This is a list of tweets</h1> 
    {{> Panel}} 
</body> 

<template name="Panel"> 
<h2>A list of tweets sorted by size</h2> 
    {{#each items}} 
     <p>item</p> 
    {{/each}} 
</template> 

Ve sayfa yüklendiğinde konsol çıkışı:

Tweet count: 0 
Tweet count: 129 
Tweet count: 272 
Tweet count: 366 
Tweet count: 457 
Tweet count: 547 
Tweet count: 672 
Tweet count: 814 
Tweet count: 941 
Tweet count: 1000 

Yani yardımcı işlevi sayfasında 10 kez ateşler yük (kat sayısı değişir). Burada neler olduğunu açıklayan var mı? Buna herhangi bir referans bulamıyorum, yardımcının şablonda birden çok {{}} yerden çağrıldığı durumlarda kabul et. Ayrıca bunu durdurmak için herhangi bir yolu? Sonunda tweet'leri işlenmeden önce bir seferde işlemek zorundayım.

cevap

7

Bulduğunuzda meteor, bulduğunuz koleksiyondaki şablon yardımcısının bağımlılığını kaydeder. Bu bağımlılık nedeniyle meteor, koleksiyondaki her değişiklik için şablon yardımcısını arayacak.

Henüz abone olmadıysanız, mongo koleksiyonunuzun istemci tarafında bir kopya yok. Sadece aboneliği aradığınızda meteor, sunucudaki verileri çekmeye başlar.

Bu nedenle yöntem, defalarca çağrılır; çünkü abone, yeni dökümanları mongo koleksiyonunun yerel kopyasına eklemeye devam eder ve bu da şablon yardımcısına yeni çağrıları tetikler.

Bu, verebileceği herhangi bir sorunla karşı karşıya gelmek için en iyi desen yardımcıya abone olmak ve documentation aboneliğindeki hazır yöntemini kullanmaktır. Hazır aynı zamanda reaktiftir, böylece tüm veriler hazırda çekildiğinde doğru olarak değiştirilecek ve yardımcı tekrar çağrılacaktır.

Template.Panel.helpers({ 
     items: function() { 
      var ready = Meteor.subscribe('tweets').ready(); 
      var days_tweets = Tweets.find(); 

      return { 
       data: days_tweets, 
       ready: ready 
      }; 
     }); 
    } 

Şablon kendisi:

{{#with items}} 
    {{#if ready}} 
     {{#each data}} 
      <p>item</p> 
     {{/each}} 
    {{else}} 
     Show a spinner or whatever 
    {{/if}} 
{{/with}} 
+0

Tamam teşekkürler. Bunun gibi bir şey üstlendim. Bunu durdurmak için herhangi bir yolu var mı? (sunucudaki koleksiyonun değişmediğini varsayarsak, buradaki durumdur). Sabit sunucu ve istemci koleksiyonu arasında eşzamansız bir şekilde çalışan bir senkronizasyon olması garip görünüyor. – kendlete

+0

@kendlete, meteor'ın abone sistemi ile çalışmanın nasıl yapılacağına dair bir örnekle güncellediler –

+0

'Meteor.subscribe()' ayrıca, abonelikler açılana kadar daha fazla kodun eklenmesini geciktirmek için kullanılabilecek bir dokümana da sahip olabilir. hazır. Abonelik hazır olduğunda bir boolean döndüren .ready() farklıdır. Muhtemelen Marco'nun yaklaşımından biraz daha hantal. – Paul

İlgili konular