2011-08-17 27 views
10

Tôi có một ứng dụng bao gồm một bộ sưu tập Backbone.js và kết nối thời gian thực với máy chủ.Cập nhật bộ sưu tập Backbone.js mà không xóa các mô hình cũ

Mỗi lần khách hàng thêm/xóa/cập nhật mô hình trong bộ sưu tập, bộ sưu tập được cập nhật sẽ được phát cho tất cả khách hàng khác (không phải đồng bằng; toàn bộ bộ sưu tập).

Khi xử lý sự kiện cập nhật này từ các ứng dụng khách khác, cách duy nhất tôi tìm thấy khi cập nhật bộ sưu tập là đặt lại(). Thật không may, điều này sẽ xóa các mô hình cũ và tạo ra các mô hình mới, cùng với tất cả các hiệu ứng phụ liên quan đến khung nhìn.

Có cách nào để xử lý và cập nhật mô hình gốc (so sánh theo id), tạo/xóa chúng chỉ khi cần thiết?

CẬP NHẬT Phương thức đã thêm phương thức Collection.set, có khả năng cập nhật các mô hình hiện có.

+0

liên quan: https://github.com/documentcloud/backbone/issues/955 – philfreo

Trả lời

8

Các giải pháp tôi đã đi với là:

Backbone.Collection.prototype.update = function(colIn){ 

    var ids = []; 

    _(colIn).each(function(modIn){ 
    var existing = this.get(modIn); 
    // update existing models 
    if (existing) { existing.set(modIn); } 
    // add the new ones 
    else { this.add(modIn); } 

    ids.push(modIn.id); 
    }, this); 

    // remove missing models (optional) 
    var toRemove = this.reject(function(model){ 
    return _(ids).include(model.id); 
    }); 

    this.remove(toRemove); 
    return this; 
}; 
+2

Tuyệt vời. Chỉ một điều ... thêm 'trả lại kết quả này '; Các phương thức xương sống luôn trả về đối tượng ngữ cảnh của chúng để bạn có thể chuỗi chúng ('my_col.update (x) .toJSON()'). – Jake

+0

Xong. Cảm ơn, Jake. –

0

khi bạn thêm mô hình vào bộ sưu tập thì lệnh gọi lại 'thêm' được gọi. Hãy sử dụng điều đó thay vì đặt lại.

+1

Nếu chỉ trạng thái delta được phát trên thay đổi (ví dụ: 'model A đã được thêm/xóa/cập nhật'), đây sẽ là giải pháp đúng. Tuy nhiên, toàn bộ bộ sưu tập được phát lại thay vì một lần tại một thời điểm, do đó, câu hỏi là, làm thế nào để giữ lại các phiên bản gốc của các mô hình hiện có. –

0

Bạn có thể mở rộng phương pháp thu thập của add và kiểm tra có cho mô hình tồn tại

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