2012-04-30 36 views
5

Tôi đang cố gắng tạo một chức năng phân trang để sử dụng trong ứng dụng Meteor. Vì vậy, tôi cần biết số lượng bản ghi trên máy chủ.Cách lấy kết quả của hàm Meteor.call trong một mẫu

Trên máy chủ (server/bootstrap.coffee) Tôi có mã này:

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

Phần máy chủ được gọi là (nó sẽ hiển thị số lượng chính xác trên console - 40)

Trên khách hàng tôi có:

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

Từ trình duyệt console Template.pager.RecordCount() trả về

không xác định
r 30

Tôi hiểu 'undefined' là sự trở lại từ Template.pager.RecordCount() và nó sẽ được trả về đầu tiên.

Khi kết quả có sẵn, nó sẽ được hiển thị trên bảng điều khiển.

Nhưng làm cách nào để nhận được giá trị của kết quả trong mẫu máy nhắn tin của tôi?

Tôi đang tìm kiếm cuộc gọi lại java trong vài giờ ngay bây giờ, nhưng bất cứ điều gì tôi cố gắng, tôi không thể làm cho nó hoạt động.
Vui lòng trợ giúp.

Đây là bản cập nhật.

Tôi đã xem tài liệu về việc vô hiệu. Nhưng ví dụ này không giúp tôi nhiều. Nhiệt độ được đặt trong máy khách với một paramater trong lời gọi hàm. Vì vậy, không có gọi lại được sử dụng. Gọi lại là vấn đề của tôi.

Tôi giải quyết nó như thế này:

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) 

này hoạt động. Tôi vẫn tự hỏi nếu đây là giải pháp tốt nhất. Tôi có nhiều cuộc gọi Session.set() và có thể có quá nhiều kích hoạt xảy ra.

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

Trả lời

2

Bạn cần phải vô hiệu hóa các mẫu, điều này có thể được thực hiện bằng cách sử dụng các phiên trong mẫu helper của bạn, sử dụng bộ sưu tập hoặc sử dụng bối cảnh vô hiệu:

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

Cập nhật:

Thành thật mà nói những gì bạn có là chính xác như bạn nói, tôi sẽ chỉ giảm thiểu số lượng phiên. Về cơ bản có ba cách để vô hiệu hóa một khuôn mẫu: buộc một sự vô hiệu hóa với context.invalidate(), Cập nhật một bộ sưu tập khách hàng hoặc cập nhật một phiên.

Vì vậy, yeah bạn có thể sử dụng mã này (Sudo lộn xộn như tôi không sử dụng kịch bản cà phê)

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

Hãy nhìn vào bản cập nhật cho câu hỏi của tôi. –

+0

Cá nhân tôi đang làm những việc tương tự bằng cách gọi vô hiệu hóa trên bối cảnh chính xác khi gọi lại được thực hiện. Về cơ bản bạn đang làm những điều tương tự nhưng với các phiên. Tuy nhiên, tôi đang sử dụng những người trợ giúp cho phép bạn trả lại chuỗi html nhưng bạn có thể thực hiện theo các cách khác. Tôi sẽ thêm mẫu mã vào câu trả lời ở trên. – jonathanKingston

+0

Tôi rất muốn xem mẫu mã sử dụng không hợp lệ. Tôi có ý tưởng rằng việc sử dụng Phiên quá nhiều sẽ kích hoạt nhiều hành động trên internet có thể tránh được. Mã đầy đủ cho ví dụ về máy nhắn tin của tôi là trên github: github.com/eric-naguras/MyApp.git –

Các vấn đề liên quan