2013-08-09 35 views
6

Đây là một phiên bản mới của cũ question tôi:Meteor: Làm thế nào để kích hoạt chạy lại chức năng helper sau collectionHandle.ready() là đúng

Vì vậy, nhờ sự giúp đỡ Tom Coleman cuối cùng tôi đã tìm ra cách để kiểm tra đúng nếu một đăng ký đã sẵn sàng() hay không.

cấu trúc mã hiện tại của tôi trông như thế này:

/client/app.js: 

eventsHandle = null; 
groupsHandle = null; 
// ... 
// First Deps.autorun(): 
// Does not depend on any Session var, should just run every time 
Deps.autorun(function() { 
    eventsHandle = Meteor.subscribe("events", function() { 
     console.log('Deps.autorun(): Events loaded'); 
    }); 
}); 

// Second Deps.autorun(): 
// contains all subscriptions which are dependent on my Session var "ehash" 
Deps.autorun(function() { 
    if(Session.get('ehash')) 
     groupsHandle = Meteor.subscribe("groups", Session.get('ehash'), function() { 
      console.log('Deps.autorun(): Groups loaded with ehash: ' + Session.get('ehash')); 
     }); 
}); 
// ... 

Sau đó, tôi có cái nhìn cụ thể .js và các file .html cho tất cả các mẫu công cụ trong một thư mục có tên:

/client/views/ 
--> <page>.js: 

Template.x.dataLoaded = function() { 
    if(Session.get('ehash')) 
     if(eventsHandle && groupsHandle && eventsHandle.ready() && groupsHandle.ready()) { 
      console.log('All data loaded!'); 
      singleevent = Events.find({ehash: Session.get('ehash')}).fetch()[0]; 
      return true; 
     } 
} 

này helper dataLoaded kết thúc tốt đẹp về cơ bản mọi thứ trong mẫu tương ứng và hiển thị nội dung khi dataLoaded trả về true hoặc người khác hiển thị trình quay tải.

Vấn đề là trong nhiều trường hợp, điều này không hoạt động vì mã dataLoaded này chỉ chạy một lần. Vì vậy, nếu hai tay cầm KHÔNG sẵn sàng() tại thời điểm dataLoaded được chạy, nội dung sẽ KHÔNG BAO GIỜ xuất hiện. Trong trường hợp này, tôi vẫn thấy tất cả sự xuất hiện của console.log từ tệp app.js (công cụ Deps.autorun()) nhưng nhật ký "Tất cả dữ liệu đã tải!" không bao giờ được nhắc đến.

Vì vậy, câu hỏi của tôi là: Làm cách nào để kích hoạt chạy lại mã này để dataLoaded được chạy lại để nội dung cuối cùng sẽ hiển thị?

Trân

+0

Bạn lưu trữ ứng dụng ở đâu? –

+0

hiện là localhost. Tại sao cậu lại hỏi? –

+0

Vì Heroku có chút lạ lùng trong Chrome đối với tôi. –

Trả lời

8

Vấn đề có thể được giải quyết đơn giản bằng cách tạo ra một sự phụ thuộc:

var _dep = new Deps.Dependency(); 

Template.x.dataLoaded = function() { 
    _dep.depend(); 
    ... 
} 


function handler() { 
    ... do.stuff(); 
    _dep.changed(); 
} 

Bây giờ, mỗi khi bạn chạy _dep.changed() phương pháp, các helper sẽ chạy lại. Đơn giản!

+0

Cảm ơn câu trả lời của bạn! Đối với một số lý do này giúp whe tôi đang làm một tải lại trên một trang thông qua Cmd + L (nhảy vào thanh url) + Enter. (Vì vậy, giống như gõ vào cùng một URl một lần nữa và tải). Nhưng nếu tôi đang làm một tải lại thông qua Cmd + R, tôi kết thúc với các lỗi như thế này: http://cl.ly/image/2C2p0Y1F030Y –

+0

Bạn đã có nó tốt hơn trước: 'if (eventsHandle && groupsHandle && eventsHandle.ready () && groupsHandle.ready()) '. –

+0

Tại sao các trình xử lý tiêu chuẩn không thể xử lý vấn đề này? Đó không phải là lý do chúng ta có chúng sao? –

0

Để gọi phương thức ready() của eventHandle bạn cần dấu ngoặc đơn nếu không tôi nghĩ rằng bạn đang chỉ kiểm tra rằng phương pháp sẵn sàng tồn tại. Thảo luận về điều này là here.

Điều này có thể sẽ vẫn khiến bạn gặp sự cố nếu eventHandle đang được đặt thành các tay cầm đăng ký khác nhau ở các phần khác nhau của javascript của bạn. Thử cấu trúc các tệp của ứng dụng của bạn như được mô tả here.

+0

Cảm ơn bạn đã làm cho dấu ngoặc đơn rõ ràng! Về cấu trúc: Tôi đã thử đặt tất cả các đăng ký của mình vào ONE Deps.autorun() cho toàn bộ dự án sao băng (đó là ý của bạn, đúng không ?!). Vấn đề là tôi không thể truy cập vào các chốt sau đó trong các tập tin .js cụ thể của tôi (-> 'client/views/

0

Điều này có vẻ phức tạp hơn mức cần thiết. Tôi khá có thể thiếu một cái gì đó, nhưng có vẻ như với tôi bạn chỉ đang cố gắng để thiết lập một spinner tải khi dữ liệu được nạp. Tôi đã đăng một cách đơn giản, dễ đọc hơn của showing "loading" in Meteor.

+0

Tôi đã thử phương pháp này nhưng vì lý do nào đó nó sẽ không hoạt động đúng cách. Có lẽ tôi đã làm gì đó sai, thử lại vào ngày mai! Gonna giữ cho bạn được đăng! :) –