2014-11-13 4 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}); 
    }); 

Die Vorlage:Meteor Helfer genannt mehrfach durch einzelne Template-Variable

<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> 

Und die Konsole ausgegeben werden, wenn die Seite geladen wird:

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 

So ist die Hilfsfunktion 10-mal auf Seite feuert laden (die Anzahl variiert). Kann mir jemand erklären, was hier passiert? Ich kann keinen Hinweis darauf finden, akzeptiere in Situationen, in denen der Helfer von mehreren {{}} auf der Vorlage aufgerufen wird. Auch eine Möglichkeit, es zu stoppen? Irgendwann muss ich die Tweets auf einmal bearbeiten, bevor sie gerendert werden.

Antwort

7

Wenn Sie einen Meteor finden, registrieren Sie eine Abhängigkeit für diesen Vorlagenhelfer in der Sammlung, in der Sie gesucht haben. Aufgrund dieser Abhängigkeit ruft der Meteor den Template-Helper für jede Änderung an der Sammlung auf.

Wenn Sie noch nicht abonniert haben, werden keine Daten in die clientseitige Kopie Ihrer Mongo-Sammlung geladen. Nur wenn Sie subscribe anrufen, fängt Meteor an, die Daten vom Server einzuziehen.

Die Methode wird also mehrfach aufgerufen, da das Subskribier neue Dokumente in Ihre lokale Kopie der Mongo-Sammlung einfügt und neue Aufrufe des Template-Helpers auslöst.

Bestes Muster, um alle Probleme zu dem entgegenzuwirken geben kann, ist durch die Helfer abonnieren und die bereite Methode auf der Zeichnung documentation verwenden. Ready ist auch reaktiv. Wenn alle Daten in den Ready gezogen sind, werden sie auf TRUE gesetzt und der Helfer wird erneut aufgerufen.

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

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

Vorlage selbst:

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

Ok danke. Ich habe so etwas angenommen. Gibt es eine Möglichkeit, damit aufzuhören? (Angenommen, die Sammlung auf dem Server ändert sich nicht, was hier der Fall ist). Es ist seltsam, eine Synchronisierung zwischen der festen Server- und der Client-Sammlung asynchron auszuführen. – kendlete

+0

@kendlete aktualisierte meine Antwort mit einem Beispiel, wie man mit dem Verhalten des Subskriptions-Systems von Meteo arbeitet –

+0

'Meteorsubscribe()' hat auch einen Onready-Callback in den Dokumenten, der verwendet werden könnte, um mehr Code einzufügen, bis das Abonnement ist bereit. Das ist anders als .ready(), das einen booleschen Wert zurückgibt, wenn das Abonnement bereit ist. Ein wenig mühsamer als Marcos Ansatz. – Paul

Verwandte Themen