2012-07-03 18 views
5

Làm cách nào để biết sự kiện nào được kích hoạt trên bộ sưu tập Backbone khi liên kết nhiều sự kiện với nó bằng cách sử dụng .on()? Xem ví dụ sau để làm rõ. (Xem thêm các jsFiddle: http://jsfiddle.net/PURAU/3/)Lấy tên sự kiện khi sử dụng .on() cho nhiều sự kiện trên bộ sưu tập Backbone.

var Car = Backbone.Model.extend({ 
    nrOfWheels: 4, 
    color: 'red', 
    speed: 'slow' 
}); 

var Garage = Backbone.Collection.extend({ 
    model: Car 
}); 

var myGarage = new Garage(), 
    myCar = new Car(); 

myGarage.on('add change reset', function() { 
    // How do I know what event was triggered? 
    console.log('add change reset', arguments); 
}); 

myGarage.on("all", function() { 
    // In here, the name of the event is the first argument. 
    console.log('all', arguments); 
}); 

// Trigger add 
myGarage.add(myCar); 

// Trigger change 
myCar.set('speed', 'fast'); 

// Trigger reset 
myGarage.reset(); 

Trả lời

0

Bạn sẽ cần phải ghi đè lên các phương pháp trigger để làm như vậy, có một cái nhìn vào mã:

https://github.com/documentcloud/backbone/blob/master/backbone.js#L148

+0

Cảm ơn câu trả lời của bạn. –

+0

Nhận xét về chức năng kích hoạt trong trạng thái nguồn xương sống "Kích hoạt một hoặc nhiều sự kiện, kích hoạt tất cả các cuộc gọi lại bị ràng buộc. Các cuộc gọi được chuyển cùng một đối số như' trigger', ngoài tên sự kiện. " Tôi không hiểu tại sao không phải lúc nào cũng gửi tên sự kiện. Bạn có thấy lý do chính đáng không? –

+0

Không chỉ trong trường hợp sự kiện 'tất cả'. –

1

Nếu chúng ta muốn hành động cụ thể cho mỗi sự kiện theo cách đặt hàng nhất là lắng nghe mọi người, cũng nếu bạn muốn có một người nghe thay đổi tổng thể khi bất cứ điều gì thay đổi gọi nó bên trong người nghe của bạn và chỉ định tên sự kiện tại chính bạn.

myGarage.on('add', function() { 
    yourGlobalFunction(arguments, 'add'); 
    //specific actions for add 
}); 
myGarage.on('change', function() { 
    yourGlobalFunction(arguments, 'change'); 
    //specific actions for change 
}); 
myGarage.on('reset', function() { 
    yourGlobalFunction(arguments, 'reset'); 
    //specific actions for reset 
}); 

function yourGlobalFunction(prevArguments, eventName){ 
    log(prevArguments, eventName); 
} 
+2

Cảm ơn câu trả lời của bạn Daniel. Đây là những gì tôi hiện đang làm, mà giải quyết vấn đề ở bàn tay. Tôi đang tìm kiếm một giải pháp DRY hơn. Tôi đã cố gắng myGarage.on ('thêm thay đổi thiết lập lại', ...) và đã rất ngạc nhiên rằng tôi không thể có được tên sự kiện. –

+0

Tôi đoán ghi đè phương pháp kích hoạt là giải pháp duy nhất mang lại cho tôi những gì tôi muốn. :/ –

+0

Mùa hè năm 2015 và tôi không biết cách nào tốt hơn, nhưng tôi chỉ sử dụng Backbone trong một vài tháng –

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