2011-10-24 27 views
6

Tôi đã đọc tài liệu về xương sống gọi số collection.reset() xóa bộ sưu tập. Tôi muốn biết nếu nó loại bỏ các mô hình là tốt hay họ tiếp tục sống trong bộ nhớ?backbone.js: không gọi collection.reset() cũng loại bỏ các mô hình?

Nếu chúng không bị xóa, có cách nào dễ dàng hơn để xóa tất cả các mô hình trong bộ sưu tập mà không cần lặp qua các mô hình và gọi model.remove()?

Trả lời

3

Điều bạn đang tìm kiếm là, có lẽ, để các mô hình được thu gom rác. Đó là, rằng không ai có một tham chiếu đến các mô hình này nữa, sau khi chúng được lấy ra khỏi bộ sưu tập.

Xương sống thực hiện một phần của việc loại bỏ các tham chiếu được đặt trên các mô hình khi chúng được xóa khỏi bộ sưu tập. Tuy nhiên, bạn phải tự dọn dẹp nếu mã của bạn có tham chiếu đến các mô hình đó. Hầu hết thời gian, điều này xảy ra nếu các mô hình đó được đăng ký là người nghe sự kiện, như trong ví dụ này: http://jsfiddle.net/dira/4uxp4/2/

Xem the implementation of reset, bạn có thể thay đổi _removeReference để gọi chức năng dọn dẹp trên mô hình. Và trong mô hình, hãy xóa mô hình khỏi tất cả người nghe/tất cả các đối tượng khác giữ tham chiếu đến nó.

+2

Không ghi đè hoặc thay đổi phương pháp hoặc tài sản gạch-tiền tố. Xem câu trả lời của tôi, dưới đây cho một lời giải thích. –

3

Bạn có thể nghe sự kiện reset từ mô hình và làm sạch và this.destroy() để phản hồi. Đó là những gì móc sự kiện được cho. Xem http://backbonejs.org/#Events-catalog

Lưu ý: Bạn hoàn toàn không nên thay đổi hoặc ghi đè bất kỳ phương pháp hoặc thuộc tính nào được đặt trước bằng dấu gạch dưới, chẳng hạn như _removeReference. Dấu gạch dưới có nghĩa là nó được dự định như là một phương thức nội bộ hoặc thuộc tính, và rằng việc triển khai nội bộ có thể thay đổi (API của chúng được coi là không ổn định). Nâng cấp Backbone có thể phá vỡ bất kỳ mã nào dựa trên các phương thức có tiền tố gạch dưới, ngay cả khi bản phát hành được quảng cáo dưới dạng thay đổi tương thích ngược.

Tôi biết câu hỏi của bạn nói "không lặp lại", nhưng đó thực sự là cách đáng tin cậy nhất để xử lý vấn đề này. Hãy xem xét trường hợp một mô hình đã được chuyển từ bộ sưu tập này sang bộ sưu tập khác, nhưng nó vẫn đang lắng nghe sự kiện reset của bộ sưu tập đầu tiên (vì một lập trình viên sáu tháng sau đó không nhận thấy kết nối).

Bây giờ khi bộ sưu tập đầu tiên được đặt lại, mô hình đã di chuyển sẽ bị hủy. Rất tiếc! Lặp lại bộ sưu tập có lẽ là cách tốt nhất để xử lý việc này nếu bạn không có điểm cuối trên API sẽ xóa tất cả các đối tượng trong bộ sưu tập theo lô trên máy chủ API (thường là cách xử lý này) .

May mắn thay, lặp đi lặp lại đó là khá dễ dàng:

destroyAll: function() { 
    var promises = []; 

    while(this.models.length > 0) { 
    promises.push(this.models[0].destroy()); 
    } 

    // handle errors communicating with the server 
    $.when(promises).fail(function (response) { 
    this.trigger('syncError', 
     response); 
    }.bind(this)); 
} 
+0

this.models [0] không hoạt động đối với tôi, this.models.first() đã làm –

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