2012-04-30 8 views
5

Ich versuche, eine Paginierungsfunktion für die Verwendung in einem Meteor-Client zu erstellen. Daher muss ich die Anzahl der Datensätze auf dem Server wissen.So erhalten Sie das Ergebnis einer Meteor.call-Funktion in einer Vorlage

auf dem Server (in Server/bootstrap.coffee) ich diesen Code haben:

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

Der Server-Teil genannt wird (es zeigt die richtige Nummer auf der Konsole - 40)

Auf der Client ich habe:

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

Von der Browserkonsole Template.pager.RecordCount() gibt

undefinierte
R 30

I die 'undefiniert' zu verstehen die Rückkehr aus Template.pager.RecordCount() ist, und es wird zuerst zurückgegeben.

Wenn das Ergebnis verfügbar ist, wird es der Konsole angezeigt.

Aber wie bekomme ich den Wert von Ergebnis in meiner Pager-Vorlage?

Ich suche Java-Callbacks für ein paar Stunden jetzt, aber was auch immer ich versuche, ich kann es nicht zur Arbeit bekommen.
Bitte helfen.

Hier ist ein Update.

Ich schaute auf die Dokumentation für ungültig zu machen. Aber das Beispiel hilft mir nicht viel. Die Temperatur wird im Client mit einem Parameter im Funktionsaufruf eingestellt. Es wird also kein Rückruf verwendet. Der Rückruf war mein Problem.

ich es wie folgt gelöst:

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) 

Dies funktioniert. Ich frage mich immer noch, ob dies die beste Lösung ist. Ich habe viele Session.set() -Aufrufe und vielleicht gibt es zu viel Auslösung.

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

Antwort

2

Sie müssen die Vorlage ungültig zu machen, kann dies durch Verwendung von Sitzungen in der Vorlage Helfer durchgeführt wird, Sammlungen oder mit dem Invalidier Zusammenhang mit:

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

Update:

ehrlich zu sein Was Sie haben, ist richtig, wie Sie sagen, ich würde nur die Anzahl der Sitzungen minimieren. Grundsätzlich gibt es drei Möglichkeiten, eine Vorlage ungültig zu machen: Erzwinge eine Invalidierung mit context.invalidate(), Aktualisiere eine Client-Sammlung oder aktualisiere eine Sitzung.

Also ja können Sie diesen Code verwenden (Sudo chaotisch wie ich Kaffee Skript nicht verwenden)

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

Schauen Sie bitte auf das Update auf meine Frage. –

+0

Persönlich mache ich ähnliche Dinge, indem ich im richtigen Kontext Ungültigmachen aufruft, wenn der Rückruf abgeschlossen ist. Sie machen im Grunde die gleichen Dinge, aber mit Sitzungen. Ich benutze jedoch Helfer, mit denen Sie HTML-Strings zurückgeben können, aber Sie könnten es auf andere Weise implementieren. Ich werde ein Codebeispiel zu meiner Antwort oben hinzufügen. – jonathanKingston

+0

Ich würde gerne ein Codebeispiel mit ungültigen sehen. Ich habe die Idee, dass die Verwendung von Session zu viel eine Menge von Internet-Aktionen auslösen wird, die vielleicht vermieden werden können. Der vollständige Code für mein Pager Beispiel ist auf GitHub: github.com/eric-naguas/MyApp.git –