2013-02-11 4 views
5

Ich muss Kunden über Änderungen auf der Serverseite informieren. In meinem Fall verwende ich verschiedene Collections auf Server und auf Client (mehr dazu in dieser Frage: how would you build pinterest like page with meteor.js).Wie schiebt man Daten vom Server zu allen Clients, die Collections nicht verwenden?

Auf dem Server bekomme ich neue Produkte von externen API. Ich möchte die Anzahl der neuen Elemente für alle Clients veröffentlichen, damit sie ihre lokalen Variablen aktualisieren können, damit das Layout gut funktioniert. Wie geht das?

Es wäre nett, wenn ich andere Arten von Daten als Meteor.Collection veröffentlichen/subskribieren könnte. Ich habe Meteor.deps gefunden, aber was ich verstehe, funktioniert nur auf der Client-Seite.

+0

Es gibt einen neueren Beitrag mit detaillierten Antworten hier: http://stackoverflow.com/questions/18584757/ –

Antwort

2

Um zu erreichen, was Sie wollen, brauchen Sie eine andere Sammlung - auf dem Client. Erstellen Sie auf dem Server in einer Veröffentlichungsfunktion ein Dokument von Grund auf, und weisen Sie die aktuelle Anzahl der Produkte einem Attribut zu. Verwenden Sie observe() und set, ändern Sie count, wenn Dokumente hinzugefügt oder aus Produkten entfernt werden. Abonnieren Sie den count "Datensatz" auf dem Client.

// Server 
Meteor.publish('count', function() { 
    // Build a document from scratch 
    var self = this; 
    var uuid = Meteor.uuid(); 
    var count = Products.find().count(); 
    // Assign initial Products count to document attribute 
    self.set('count', uuid, {count: count}); 

    // Observe Products for additions and removals 
    var handle = Products.find().observe({ 
     added: function (doc, idx) { 
      count++; 
      self.set('counts', uuid, {count: count}); 
      self.flush(); 
     }, 
     removed: function (doc, idx) { 
      count--; 
      self.set('counts', uuid, {count: count}); 
      self.flush(); 
     } 
    }); 
    self.complete(); 
    self.flush(); 
    self.onStop(function() { 
     handle.stop(); 
    }); 
}); 

// Client 
Counts = new Meteor.Collection('count'); 
Meteor.subscribe('count'); 
console.log('Count: ' + Counts.findOne().count); 
+1

Sehr schöner Trick - ich würde auch empfehlen, Blick auf eventedmind Tutorial auf dem DDP-Protokoll, das einige Grundlagen, um zu verstehen gibt, was vor sich geht : http://www.eventedmind.com/posts/meteo-subscriptions-and-ddp – sarfata

0

muss ich sagen die obige Lösung zeigte mir eine Art und Weise, aber immer noch, was passiert, wenn ich Kundendaten veröffentlichen müssen, die mit beobachten nicht angeschlossen sind()? Oder mit irgendeiner Sammlung?

In meinem Fall habe ich d. H. 1000 Produkte. Um Besucher anzulocken, "erfrische" ich die Sammlung, indem ich den Zeitstempel einer zufälligen Anzahl von Produkten aktualisiere und die Sammlung nach Zeitstempel sortiert ansehe. Dank diesem Eindruck haben Besucher den Eindruck, dass etwas passiert.

Meine refresh Methode gibt die Anzahl der Produkte zurück (es ist zufällig). Ich muss diese Nummer an alle Kunden weitergeben. Ich habe es getan, aber ich benutze (glaube ich) hässliche Problemumgehung.

Meine refresh Methode setzt Session.set('lastRandomNo', random). BTW: Ich wusste nicht, dass Session auf Serverseite funktioniert. refresh updates Produkte Sammlung.

accoriding Dann oben Antwort:

Meteor.publish 'refreshedProducts', -> 

self = this 
uuid = Meteor.uuid() 

# create a new collection to pass ProductsMeta data 
self.set('products_meta', uuid, { refreshedNo: 0 }) 

handle = Products.find().observe 
    changed: (newDocument, atIndex, oldDocument) -> 
    self.set('products_meta', uuid, { refreshedNo: Session.get('lastRandomNo') }) 
    self.flush() 

self.complete() 
self.flush() 
self.onStop -> 
    handle.stop() 

und auf Client-Seite:

ProductsMeta = new Meteor.Collection('products_meta') 

# subscribe to server 'products_meta' collection that is generated by server 
Meteor.subscribe('refreshedProducts') 

ProductsMeta.find({}).observe 
    changed: (newDocument, atIndex, oldDocument) -> 

    # I have access to refreshedNo by 
    console.log ProductsMeta.findOne().refreshedNo 

Was denken Sie?

Verwandte Themen