2013-08-16 33 views
18

Tôi đang cố tạo hệ thống thông báo đơn giản cho quản trị viên trang web của mình và tôi chỉ cần gửi tin nhắn theo thời gian thực cho mọi người dùng quản trị viên. Nhưng khi tôi sử dụng firebase, nó tải dữ liệu cũ trên mỗi trang và người dùng thấy tất cả các thư từ cơ sở dữ liệu. Nếu tôi đặt giới hạn (1) người dùng sẽ thấy thông báo cuối cùng trên mỗi trang tải lại:Làm cách nào để truy xuất dữ liệu mới?

var eventsList = new Firebase('https://*****-messages.firebaseio.com/'); 

eventsList.on('child_added', function(message) { 
    var message = message.val(); 
    $.notification(message.message); 
}); 

Làm cách nào tôi chỉ có thể tải thư mới mà không có lịch sử thông báo cũ?

+1

Kể từ Firebase 2.x, hiện có một số cách nhanh hơn để thực hiện việc này bằng truy vấn. Xem câu trả lời thay thế cho [Cách loại bỏ dữ liệu ban đầu trong DB Firebase] (http://stackoverflow.com/a/27693310/394010) – Kato

+0

Vì trường hợp sử dụng phổ biến cho câu hỏi này đang tạo hàng đợi thư, câu trả lời hay nhất là sử dụng một [chiến lược xếp hàng thông báo] (https://github.com/firebase/firebase-work-queue), nơi các sự kiện được thêm vào và xóa khỏi hàng đợi, và không bận tâm với sự phức tạp này. Vui lòng xem xét tuyến đường đó trước bất kỳ câu trả lời nào bên dưới – Kato

Trả lời

34

Điều này theo thiết kế, trong một hệ thống thời gian thực không có khái niệm về dữ liệu "mới nhất" vì nó luôn thay đổi. Tuy nhiên, nếu bạn muốn mục chỉ hiển thị thêm vào danh sách sau trang đã được nạp, bạn có thể làm như sau:

var newItems = false; 
var eventsList = new Firebase('https://*****-messages.firebaseio.com/'); 

eventsList.on('child_added', function(message) { 
    if (!newItems) return; 
    var message = message.val(); 
    $.notification(message.message); 
}); 
eventsList.once('value', function(messages) { 
    newItems = true; 
}); 
+0

Nó hoạt động! Cảm ơn bạn! – inlanger

+8

Điều gì xảy ra nếu danh sách hiện tại là rất lớn. Cuộc gọi lại cho trẻ được thêm vào sẽ được gọi cho mỗi người trong số họ. Điều này có thể gây ra các vấn đề sau: 1. Nó có thể giữ thread UI của tôi bận rộn xử lý tất cả các callbacks 2. Không cần thiết tiêu thụ băng thông trong việc tải dữ liệu 3. Trên một kết nối flaky, nó có thể mất rất nhiều thời gian cho quá trình khởi tạo 4. Nếu tôi có một thay đổi theo dõi tham chiếu firebase cho một số chi nhánh khác, nó sẽ không nhận được callback cho đến khi các hoạt động bổ sung con được thực hiện cho ref này ... Am i correct ?? – Kartik

+2

Trả về "if (! NewItems);" kiểm tra nên được ngay từ đầu vì vậy tất cả các dữ liệu ban đầu sẽ bị bỏ qua và nên được khá nhanh. Nếu bạn không thực sự muốn tải xuống dữ liệu, tốt nhất bạn nên sử dụng giới hạn/truy vấn để giới hạn lượng dữ liệu chính xác với những gì bạn muốn. – Anant

5

tôi sẽ bình luận gì về việc trên, nhưng do uy tín tôi không thể, vì vậy hy vọng điều này là đầy đủ và đây là để giải quyết các bình luận cuối cùng của Gruff McGruff.

Khi hỏa hoạn sau vì bạn muốn thoát khỏi vòng lặp lấy tất cả các mục con. Khi các vòng lặp đó bị hỏng, bạn sẽ đặt biến số newItems thành true và sau đó nó sẽ có thể nhận được tất cả các con mới sau đó.

Nếu bạn đã kích hoạt nó trước đó, nó sẽ đánh bại mục đích và lấy tất cả các mục con bất kể vì bạn sẽ đặt biến số newItems ngay lập tức.

Ngoài ra, tôi đã sử dụng cách tiếp cận này và nó hoạt động tốt.