2013-04-16 18 views
9

Tôi muốn chạy view.render() nếu cả collectionA và collectionB đều kích hoạt sự kiện 'sync'. Một cái gì đó như thế này.Có cách nào để chờ gọi lại gọi lại cho đến khi nhiều bộ xương sống được đồng bộ hóa không?

collectionA = new CollectionA(); 
collectionB = new CollectionB(); 

view.listenTo([collectionA, collectionB], 'sync', view.render); 

collectionA.fetch(); // do not call view.render yet. 
collectionB.fetch(): // call view.render after fetch. 

Tôi biết có cách sử dụng $ .when() hoặc _.after() như câu trả lời này. How to synchronize multiple Backbone.js fetches?

Nhưng tôi nghĩ đây không phải là cách hướng sự kiện. Có cách nào hướng sự kiện trên Backbone.js không?

Trả lời

10

Bạn có thể sử dụng một sự kết hợp của phương pháp after gạch để chỉ thực hiện gọi lại khi nó được gọi là một số lần, và Backbone.Events.once để đảm bảo rằng bạn không kích hoạt xử lý sớm, nếu một trong những bộ sưu tập bắn hai sync sự kiện , thay vì một từ mỗi:

var callback = _.after(2, view.render); 
collectionA.once('sync', callback, view); 
collectionB.once('sync', callback, view); 

Hoặc bạn có thể bọc logic thành một chức năng hữu ích, vì vậy bạn có thể sử dụng nó với một số biến của nguồn sự kiện:

function onceAll(eventSources, eventName, handler, context) { 
    handler = _.after(eventSources.length, handler); 
    context = context || this; 
    _.each(eventSources, function(source) { 
     source.once(eventName, handler, context); 
    }); 
} 

Cách sử dụng:

onceAll([collectionA, collectionB], 'sync', view.render, view); 

/Mẫu mã không được kiểm tra.