2013-05-14 32 views
9

Có một hành vi mới trong phiên bản mới nhất của Backbone (1.0.0 trong đó sự kiện đặt lại không còn được kích hoạt theo mặc định sau khi tìm nạp Bộ sưu tập.phát hiện khi một bộ sưu tập xương sống đã được tìm nạp (Backbone 1.0.0)

http://backbonejs.org/#changelog

đổi tên Bộ sưu tập của "cập nhật" để thiết lập, cho xử lý song song với tương tự model.set(), và độ tương phản với thiết lập lại. Nó bây giờ mặc định cập nhật cơ chế sau khi mang lại. Nếu bạn muốn tiếp tục sử dụng "đặt lại", vượt qua {reset: true}.

Vấn đề là tôi muốn nắm bắt sự kiện khi bộ sưu tập đã được cuối cùng lấy (trường hợp khá phổ biến, quả thật vậy!)

tôi có thể nghe thêm, xóa và thay đổi sự kiện, nhưng nếu bộ sưu tập là trống rỗng Tôi không biết cách bắt sự kiện.

Vì vậy, cách thức mới, được khuyến nghị để nắm bắt khi yêu cầu thu thập đã hoàn thành là gì hoặc nó có vượt qua {reset = true} cách duy nhất để đạt được điều đó không ???

ps: đây là câu hỏi ban đầu, BTW can't catch Backbone Collection reset event

Trả lời

22

Từ Backbone.sync doc,

Bất cứ khi nào một mô hình hay bộ sưu tập bắt đầu đồng bộ hóa với máy chủ, một "yêu cầu" sự kiện được phát ra. Nếu yêu cầu hoàn tất thành công , bạn sẽ nhận được sự kiện "đồng bộ hóa" và sự kiện "lỗi" nếu không.

Ví dụ,

var C = Backbone.Collection.extend({ 
    url: '/echo/json/' 
}); 

var c = new C(); 
c.on('sync', function() { 
    console.log('sync'); 
}); 
c.fetch(); 

Và một bản demo http://jsfiddle.net/nikoshr/GLATm/

+0

có, đó là những gì tôi đang tìm kiếm – opensas

10

Chúng tôi có thể vượt qua một phương pháp như một handler thành công khi chúng ta gọi là fetch trên việc thu thập và như bạn nói bạn chỉ muốn làm điều gì đó khi mọi thứ [thêm, xóa, cập nhật hoặc đặt lại] đã xảy ra, bạn có thể thực hiện bên trong trình xử lý thành công này.

collection.fetch({ 
    success: function() { 
    // Do Something 
    // This is called when all add, remove and update operations have been done 
    } 
}); 

Lưu ý: Trình xử lý thành công luôn được thực hiện bất kể bạn đã vượt qua reset:true hay chưa. Không phân biệt bộ sưu tập của bạn có trống hay không và nó sẽ được gọi ở bước cuối cùng khi tất cả các sự kiện thêm, xóa và cập nhật đã xảy ra.

Hãy cho tôi biết nếu nó không giải quyết được sự cố của bạn.

0

Giải pháp của riêng tôi thực sự khá đơn giản. Tôi đã có một BaseCollection với các tính năng bổ sung, vì vậy trong đó tôi chỉ cần thiết lập mặc định là {reset: true}. Mã nên được một cái gì đó như thế này (BaseCollection riêng của tôi có rất nhiều thứ mà không phải là thích hợp ở đây):

var BaseCollection = Backbone.Collection.extend({ 
    fetch: function(options) { 
    options = options || {}; 
    options.reset = (options.reset === undefined ? true : options.reset); 
    // just call super.fetch 
    return Backbone.Collection.fetch.call(this, options); 
    }; 
});  
0

Sử dụng những lời hứa ...

// you could use promises as well 
// P.S.: pardon jquery promises :) 

var C = Backbone.Collection.extend({ 
    url: '/echo/json/' 
}); 

var c = new C(); 

// c.fetch() returns jqXHR object that you can listen too 
$.when(c.fetch()) 
    .done(successFn) 
    .fail(failFn) 
    .always(alwaysFn); 
Các vấn đề liên quan