2013-02-11 12 views
5

Devo informare i client delle modifiche sul lato server. Nel mio caso sto utilizzando raccolte diverse sul server e sul client (maggiori informazioni in questa domanda: how would you build pinterest like page with meteor.js).Come inviare dati dal server a tutti i client che non utilizzano le raccolte?

Sul server ricevo nuovi prodotti da API esterne. Vorrei pubblicare il numero di nuovi elementi per tutti i client che potrebbero aggiornare le loro variabili locali necessarie per il corretto funzionamento del layout. Come si fa?

Sarebbe bello se potessi pubblicare/sottoscrivere altri tipi di dati rispetto a Meteor.Collection. Ho trovato Meteor.deps, ma quello che capisco funziona solo sul lato client.

+0

C'è un post più recente con risposte dettagliate qui: http://stackoverflow.com/questions/18584757/ –

risposta

2

Per realizzare ciò che vuoi, hai bisogno di un'altra raccolta - sul client. Sul server, in una funzione di pubblicazione, crea un documento da zero assegnando il conteggio corrente di Prodotti a un attributo. Utilizzando observ() e set, modificare count quando i documenti vengono aggiunti o rimossi dai Prodotti. Abbonarsi al "record set" count sul 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

Trucco molto bello - Vorrei anche raccomandare di guardare il tutorial di eventedmind sul protocollo ddp che fornisce alcune nozioni di base per capire cosa sta succedendo : http://www.eventedmind.com/posts/meteor-subscriptions-and-ddp – sarfata

0

devo dire che la soluzione di cui sopra mi ha mostrato un modo, ma ancora, cosa succede se ho bisogno di pubblicare i dati del cliente che non sono collegati con osservare()? O con qualsiasi collezione?

Nel mio caso ho 1000 prodotti. Per coinvolgere i visitatori, sto aggiornando la raccolta aggiornando il timestamp del numero casuale di prodotti e visualizzando la raccolta ordinata per data/ora. Grazie a questo, i visitatori hanno l'impressione che stia succedendo qualcosa.

Il mio metodo refresh restituisce il numero di prodotti (è casuale). Devo passare quel numero a tutti i clienti. L'ho fatto, ma usando (credo) una brutta soluzione.

I miei set di metodi refreshSession.set('lastRandomNo', random). BTW: non sapevo che Session funzionasse dal lato server. refresh aggiornamenti Raccolta prodotti.

Poi accoriding alla risposta di cui sopra:

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

e sul lato client:

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 

Cosa ne pensi?

Problemi correlati