2012-04-30 4 views
5

Sto provando a creare una funzione di impaginazione da utilizzare in un client Meteor. Quindi ho bisogno di conoscere il conteggio dei record sul server.Come ottenere il risultato di una funzione Meteor.call in un modello

Sul server (server/bootstrap.coffee) Ho questo codice:

Meteor.methods 
    ContactsCount: -> 
    Contacts.find().count() 
    console.log("Totalrecords: " + Contacts.find().count()) 

La parte server si chiama (si visualizza il numero corretto sulla console - 40)

Sul cliente che ho:

$.extend Template.pager, 
    GetRecordCount: -> 
    Meteor.call("ContactsCount", (error,result) -> 
    console.log('r', result) 

Dal Template.pager.RecordCount console del browser() restituisce

indefinito
r 30

Capisco la 'undefined' è il ritorno da Template.pager.RecordCount() e viene restituito prima.

Quando il risultato è disponibile viene visualizzato sulla console.

Ma come si ottiene il valore del risultato nel modello di cercapersone?

Sto cercando i callback Java per alcune ore, ma qualunque cosa provi, non riesco a farlo funzionare.
Per favore aiuto.

Ecco un aggiornamento.

Ho esaminato la documentazione per invalidare. Ma l'esempio non mi aiuta molto. La temperatura viene impostata nel client con un parametro nella chiamata di funzione. Quindi non viene utilizzata la richiamata. Il callback era il mio problema.

ho risolto in questo modo:

Meteor.call("ContactsCount", myFunc) 

### This is the call back function when the server 
    function 'Meteor.call("ContactsCount", myFunc)' is called 
    When the result from the server call is returned, this will be executed ### 
myFunc = (error, result) -> 
if !error 
    pages = result/Session.get("page_size") 
    Session.set "total_pages", Number(pages.toFixed(0) + 1) 
    Session.set "total_records", result 
if error 
    console.log(error) 

Questo funziona. Mi sto ancora chiedendo se questa è la soluzione migliore. Ho molte chiamate Session.set() e forse c'è troppa attivazione in corso.

### This function will set the css classes 
    for enabling or disabling the pager buttons 
    in the Pager Template in myapp.html ### 
SetPagerButtons = -> 
Meteor.call("ContactsCount", myFunc) 
if Session.get("current_page") <= 1 
    Session.set "nextEnabled", "" 
    Session.set "lastEnabled", "" 
    Session.set "firstEnabled", "disabled" 
    Session.set "previousEnabled", "disabled" 
    Session.set "last_record", false 
else if Session.get("last_record") or Session.equals("current_page", Session.get("total_pages")) 
    Session.set "nextEnabled", "disabled" 
    Session.set "lastEnabled", "disabled" 
    Session.set "firstEnabled", "" 
    Session.set "previousEnabled", "" 
else 
    Session.set "nextEnabled", "" 
    Session.set "lastEnabled", "" 
    Session.set "firstEnabled", "" 
    Session.set "previousEnabled", "" 
    Session.set "last_record", false 

risposta

2

È necessario invalidare il modello, questo può essere fatto utilizzando le sessioni nel modello aiutante, utilizzando collezioni o utilizzando il contesto invalidate:

http://docs.meteor.com/#invalidate 

Aggiornamento:

Ad essere onesti quello che hai è corretto come dici tu, vorrei solo ridurre al minimo il numero di sessioni. Fondamentalmente ci sono tre modi per invalidare un modello: forzare una invalidazione con context.invalidate(), aggiornare una raccolta client o aggiornare una sessione.

Quindi sì è possibile utilizzare questo codice (Sudo disordinato come io non uso di script caffè)

//client server call 
total_records = 0 
page_numbers_context = null 

Meteor.call("ContactsCount", contactsCountCallback) 

contactsCountCallback = (error, result) -> 
if !error 
    total_records = result 
    if page_numbers_context 
     page_numbers_context.invalidate(); 
if error 
    console.log(error) 



//Add template handler 
Handlebars.registerHelper('page_numbers', pageNumberCallback); 
pageNumberCallback = (options) -> 
    page_numbers 

    var context = Meteor.deps.Context.current; 
    if context && !page_numbers_context 
     page_numbers_context = context 
     context.on_invalidate -> 
      page_numbers_context = null 

    pages = total_records/page_size 
    total_pages = Number(pages.toFixed(0) + 1) 
    //HTML code built with ifs here 


//In template: 
{{#page_numbers}}{{/page_numbers}} 
+0

Si prega di guardare l'aggiornamento alla mia domanda. –

+0

Personalmente sto facendo cose simili chiamando invalido sul contesto corretto quando il callback è fatto. Stai praticamente facendo le stesse cose, ma con le sessioni. Tuttavia, sto utilizzando gli helper che consentono di restituire stringhe html ma è possibile implementarlo in altri modi. Aggiungerò un esempio di codice alla mia risposta sopra. – jonathanKingston

+0

Mi piacerebbe vedere un esempio di codice che utilizza invalidate. Ho l'idea che usare troppo Session attiverà molte azioni internet che potrebbero essere evitate. Il codice completo per il mio esempio di cercapersone è su github: github.com/eric-naguras/MyApp.git –