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() が返されます

未定義
r 30

「未定義」は Template.pager.RecordCount() からの戻り値であり、最初に返されることを理解しています。

結果が利用可能になると、コンソールに表示されます。

しかし、ページャー テンプレートで結果の値を取得するにはどうすればよいでしょうか。

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
4

1 に答える 1

2

テンプレートを無効にする必要があります。これは、テンプレート ヘルパーでセッションを使用するか、コレクションを使用するか、無効化コンテキストを使用して行うことができます。

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

アップデート:

正直に言うと、あなたが言っていることは正しいです。セッションの数を最小限に抑えるだけです。基本的に、テンプレートを無効化する方法は 3 つあります。context.invalidate() で無効化を強制する、クライアント コレクションを更新する、またはセッションを更新する。

ええ、あなたはこのコードを使うことができます(私はコーヒースクリプトを使用していないので、Sudo乱雑です)

//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}}
于 2012-04-30T09:35:46.303 に答える