2016-10-02 14 views
7

Tôi muốn tải tất cả các mục khi bắt đầu mà không hiển thị bất kỳ tin nhắn nào, nhưng một lần sau khi được tải. Tôi muốn chụp bất kỳ hàng mới nào trong người đăng ký và hiển thị nó cho thông báo trên màn hình.cách kiểm tra xem đăng ký có được tải tất cả các hàng hiện có không?

Vấn đề là, tôi không chắc chắn làm thế nào để kiểm tra xem tất cả các mục trước đó có được tải không và nếu hàng là mục mới hoặc là hàng từ mục hiện có trước đó.

this.items = this.af.database.list('notifications/'+this.uid+'/'); 
this.items.subscribe(list => { 
    list.forEach(row => { 
     // doing something here... 
    }); 

    // once all the rows are finished loading, then any new row, show desktop notification message 
}); 
+0

AngularFire2 đang thực hiện việc này trong nội bộ và phát ra một loạt các 'hàng' hiện tại từ quan sát được. Bạn sẽ phải tự kiểm tra mảng, để xác định có gì mới. Thay vào đó, bạn có thể sử dụng API Firebase cơ bản. Nếu bạn sử dụng 'on (" child_added ", ...)' và 'once (" value ", ...)', các sự kiện 'child_added' bạn nhận được trước sự kiện' value' sẽ đại diện cho 'hàng' ban đầu và các sự kiện 'child_added' tiếp theo sẽ chứa 'hàng' mới. – cartant

+0

bạn có ví dụ về điều này với mã angularfire? Tôi không thể tìm thấy nó trên đó tài liệu về cách sử dụng trên ("child_added" ...) – Basit

+0

Nó nằm trong [Firebase API] cơ bản (https://firebase.google.com/docs/reference/js/firebase.database. Tài liệu tham khảo). Bạn có thể thấy cách nó được sử dụng trong [AngularFire2 source] (https://github.com/angular/angularfire2/blob/2.0.0-beta.5/src/database/firebase_list_factory.ts#L102-L156) cho danh sách có thể quan sát được. – cartant

Trả lời

0

Tôi có người dùng lodash cho mã tối thiểu.

// this varible holds the initial loaded keys 
let loadedKeys = []; 
this.items = this.af.database.list('notifications/'+this.uid+'/'); 
this.items.subscribe((list)=>{ 
    // we skip it while initial load 
    if(!_.isEmpty(loadedKeys)){ 
    // different is the new keys 
    let newKeys = _.difference(_.map(list, "$key"), loadedKeys); 
    if(!_.isEmpty(newKeys)){ 
     // ... notification code here 
    } 
    } 
    loadedKeys = _.map(list, "$key"); 
}); 
0

Hành vi bạn đang tìm kiếm là cách tiếp cận default Subject trong RxJS. Kiểm tra this reactiveX url để làm theo biểu đồ đá cẩm thạch Publish Subject (tương đương với Subject trong RxJS).

Vì vậy, bạn có hai lựa chọn dễ dàng:

1) bằng tay chỉ số phù thủy hàng bạn muốn hiển thị like @bash replied

2) tạo ra một Rx.Subject() và chỉ gán hàng của mới nhất với nó. Sau đó, bạn đăng ký chủ đề này trong quy trình làm việc của ứng dụng.

Lợi thế của phương pháp 2 là khi xảy ra .subscribe mới, nó sẽ không truy xuất dữ liệu trước đó.


Edit: Tôi đã viết this codepen như một hướng dẫn để thực hiện tùy chỉnh của bạn RxJS Subject. Hy vọng nó giúp.

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