2015-05-17 23 views
6

Tôi đang sử dụng các lĩnh vực thông tin trong hệ thống Meteor.users bộ sưu tập được xác định để lưu trữ thông tin về người sử dụng tin nhắn cuối cùng đọc trên tất cả các kênh thông tin liên lạc với cơ cấu như sau:Làm thế nào để chờ đợi trên Meteor.users khi thay đổi lĩnh vực hồ sơ

profile : { 
    lastMsgRead : [ 
     {channelId: 'YYEBNEI7894K', messageCreatedAt: '14578970667"} 
     {channelId: 'GERYUE789774', messageCreatedAt: '14578999845"} 
    ] 
} 

tôi phát hiện ra rằng đọc lĩnh vực lastMsgRead thất bại vì trên máy khách mảng trong vẫn trống tại thời điểm đọc. tôi công bố một cách chính xác lĩnh vực này cho khách hàng thông qua:

Meteor.publish(null, function() { 
    return Meteor.users.find({}, {fields: {_id: 1, username: 1, emails: 1, profile :1}}); 

và tôi đọc giá trị của nó từ thư viện khách hàng nằm trong thư mục lib, theo cách này:

var chHistory = Meteor.user().profile.lastMsgRead; 

Gỡ rối mã của tôi có vẻ như những thay đổi tôi thực hiện đối với trường hồ sơ chưa được phổ biến cho tất cả khách hàng tại thời điểm tôi đọc chúng. Vì vậy, tôi cần phải chờ đợi cho các thuê bao Meteor.users được sẵn sàng, nhưng tôi không có xử lý của nó ─ bạn nhận được điều này tự động từ khuôn khổ.

Làm thế nào tôi có thể chờ cho thuê bao Meteor.users bị sẵn sàng chưa?

+0

Câu trả lời có giải quyết được vấn đề cụ thể của bạn hay không (đảm bảo rằng trường con được điền trước khi làm việc với nó) phù hợp với bạn? Tôi không chắc chắn câu hỏi hiện tại của bạn (chắc chắn rằng một thuê bao chưa đặt tên đã sẵn sàng) có thể trả lời bằng bất cứ điều gì khác ngoài "Meteor hiện không cung cấp tính năng như vậy". –

Trả lời

6

Vì sao băng không cung cấp cho bạn với một tay cầm cho thuê bao của người dùng hiện nay, có không phải là một cách rõ ràng để chờ đợi trên dữ liệu. Dưới đây là một số tùy chọn:

sử dụng một người bảo vệ

Cách thông thường để xử lý vấn đề này là để thêm guards mã của bạn.Trong mẫu của bạn (s) mà đang gặp vấn đề này bạn có thể viết một cái gì đó như:

var user = Meteor.user(); 
var lastMsgRead = user && user.profile && user.profile.lastMsgRead; 

Nếu bạn thấy bạn viết mã rất nhiều, bạn có thể yếu tố nó ra thành một chức năng chia sẻ:

var extractProfileValue = function(key) { 
    var user = Meteor.user(); 
    return user && user.profile && user.profile[key]; 
}; 

Và sử dụng nó như thế này:

var lastMsgRead = extractProfileValue('lastMsgRead'); 

hiển thị một spinner

Bạn có thể kiểm tra sự tồn tại của profile của người dùng trong các mẫu tự:

<template name='myTemplate'> 
    {{#unless currentUser.profile}} 
    // show spinner or loading template here 
    {{else}} 
    // rest of template here 
    {{/unles}} 
</template> 

Nếu bạn muốn trải nghiệm này trên tất cả các trang của bạn, bạn có thể thêm nó vào mẫu bố cục của bạn (s).

xuất bản thừa

CẢNH BÁO: Tôi đã không cố gắng này

Một cách để có được xử lý thuê bao của người dùng được chỉ để thêm một nhà xuất bản không cần thiết và đăng ký với nó:

Meteor.publish('myProfile', function() { 
    return Meteor.users.find(this.userId, {fields: {profile: 1}}); 
}); 

Sau đó, trong bộ định tuyến của bạn:

waitOn: function() { 
    return Meteor.subscribe('myProfile'); 
} 
+0

Cảm ơn! Tôi đang thử tùy chọn ** nhà xuất bản dự phòng **, nhưng tôi có một vài câu hỏi cho bạn: (a) sẽ không tốt hơn nếu bạn tránh trường tiểu sử của bộ sưu tập người dùng? Tôi đã nghe nói hành vi của nó sẽ sớm được thay đổi, vì vậy có thể một bộ sưu tập Profiles mới sẽ tốt hơn; (b) Tôi cần đảm bảo rằng bộ sưu tập được đồng bộ trong thư viện (/ lib directory). Tôi có thể gọi 'handle = Meteor.subscribe ('myProfile');' trong thư viện đó và sau đó kiểm tra 'handle.ready()' trước khi kiện 'Profiles.find()'? – massimosgrelli

+0

(a) Tôi không có bất kỳ kiến ​​thức bên trong về điều này. Tôi đoán rằng điều gì đó gần như có thể xảy ra khi quy tắc cho phép được sửa đổi cho 'hồ sơ' (ngay bây giờ nó có thể được cập nhật trên máy khách theo mặc định nhưng có lẽ không nên). Tôi nghi ngờ MDG sẽ sớm rời khỏi lĩnh vực này bất cứ lúc nào. (b) Có, đó là một thuê bao bình thường vì vậy tôi không thấy bất kỳ lý do tại sao điều đó sẽ không hoạt động. –

-1

Bạn cần phải đọc http://docs.meteor.com/#/full/meteor_user một lần nữa.

Trên máy khách, đây sẽ là tập con của các trường trong tài liệu được xuất bản từ máy chủ (các trường khác sẽ không có sẵn trên máy khách). Theo mặc định, máy chủ xuất bản tên người dùng, email và hồ sơ (có thể ghi bởi người dùng). SeeMeteor.users để biết thêm về các trường được sử dụng trong tài liệu người dùng.

Bạn có thể thêm người trợ giúp sẽ trả lại dữ liệu.

Tôi cũng sẽ loại bỏ ấn phẩm của bạn vì nó đã được đưa về chăm sóc bởi framework.

Meteor.user(). Profile.blah

+0

Nó sẽ không xuất bản tất cả các trường, các trường còn lại bạn phải tự xuất bản chúng. –

+0

Nếu bạn có Meteor.user(). Profile.fullname, nó sẽ được xuất bản. Kiểm tra nó trước khi bỏ phiếu xuống – Felix

+0

Một số trường được xuất bản và các trường khác thì không. Nếu bạn thêm các trường của riêng mình, bạn cần xuất bản chúng. –

0

Xuất bản của bạn hiển thị quá nhiều dữ liệu không cần thiết. Bạn chỉ nên xuất bản mong muốn mà bạn cần. Meteor.user() trả về một đối tượng người dùng nếu người dùng đăng nhập. Trong ấn phẩm null bạn lọc bằng cách sử dụng this.userId. Bạn có thể chờ ấn phẩm này ở cấp mẫu hoặc sử dụng Bộ định tuyến Sắt.

0

Vì bạn đang sử dụng một ấn phẩm không tự động hoặc "tự động", có một sửa chữa thực sự đơn giản cho vấn đề này và đó là thêm các sao băng: nhanh chóng hiển thị cho ứng dụng của bạn. Nó sẽ gửi tất cả dữ liệu được xuất bản tự động với html ban đầu của ứng dụng để nó có sẵn ngay lập tức khi tải trang.

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