Вопрос по callback – Как получить результат функции Meteor.call в шаблоне

5

Я пытаюсь создать функцию разбиения на страницы для использования в клиенте Meteor. Поэтому мне нужно знать количество записей на сервере.

На сервере (в server / bootstrap.coffee) у меня есть этот код:

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

Серверная часть называется (на консоли отображается правильный номер - 40)

На клиенте у меня есть:

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

Из консоли браузера возвращается Template.pager.RecordCount ()

undefined
r 30

Я понимаю "неопределенный" это возврат из Template.pager.RecordCount () и он возвращается первым.

Когда результат становится доступным, он отображается на консоли.

But how do I get the value of result in my pager template?

Я искал обратные вызовы Java в течение нескольких часов, но что бы я ни пытался, я не могу заставить его работать.
Пожалуйста помоги.

Вот обновление.

Я посмотрел на документацию для признания недействительным. Но пример не очень мне помогает. Температура задается в клиенте с помощью параметра в вызове функции. Таким образом, обратный вызов не используется. Обратный звонок был моей проблемой.

Я решил это так:

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)

Это работает. Мне все еще интересно, является ли это лучшим решением. У меня много вызовов Session.set () и, возможно, происходит слишком много триггеров.

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

Ваш Ответ

1   ответ
2

Вам необходимо аннулировать шаблон, это можно сделать с помощью сеансов в помощнике шаблона, с помощью коллекций или с помощью контекста недействительности:

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

Обновить:

Если честно, то, что вы имеете, правильно, как вы говорите, я бы просто минимизировал количество сессий. По сути, существует три способа сделать шаблон недействительным: вызвать недействительность с помощью context.invalidate (), обновить коллекцию клиентов или обновить сеанс.

Так что да, вы можете использовать этот код (Судо грязный, поскольку я не использую сценарий кофе)

//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}}
Error: User Rate Limit Exceeded Eric Roijen
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Eric Roijen

Похожие вопросы