Bạn không thể làm điều này theo cách bạn muốn mà không sử dụng các tính năng không có giấy tờ.
Nếu chúng ta có một cái nhìn tại Collection#add
, chúng ta sẽ thấy điều này:
add: function(models, options) {
//...
for (i = 0, l = add.length; i < l; i++) {
(model = add[i]).trigger('add', model, this, options);
}
//...
}
Lưu ý đối số thứ tư để trigger
. Và nếu chúng ta nhìn vào giao diện tài liệu cho trigger
:
kích hoạtobject.trigger(event, [*args])
callbacks kích hoạt cho các trao kiện, hoặc dấu cách để phân định các sự kiện. Các đối số tiếp theo để kích hoạt sẽ được chuyển đến cuộc gọi lại sự kiện.
Vì vậy, các add
sẽ gọi cho người nghe như f(model, collection, options)
nơi options
là như nhau options
những gì bạn truyền cho Collection#add
.Kết quả là nếu bạn làm điều này:
this.collection.add(predefinedModel, { undocumented: 'arguments' })
sau đó bạn có thể làm điều này trong callback của bạn:
triggerthis: function(model, collection, options) {
console.log(options.undocumented);
}
Demo: http://jsfiddle.net/ambiguous/bqWwQ/
Bạn có thể của đường hầm nhiên một mảng toàn bộ hoặc một đối tượng thông qua options
theo cách này.
Đối số thứ ba cho "add"
sự kiện không được ghi nhận (ít nhất không phải là tôi có thể tìm thấy), điều gần gũi nhất với tài liệu hướng dẫn cho điều này là một ghi chú trong 0.3.3 Changelog entry:
Các phổ biến options
luận tại là được chuyển làm đối số cuối cùng cho tất cả các sự kiện "change"
.
Tôi sẽ không đề xuất phương pháp này nhưng nó sẽ có nếu bạn cần; tất nhiên bạn sẽ cần phải bao gồm điều này trong bộ thử nghiệm của bạn và bạn sẽ cần phải chắc chắn rằng bạn không sử dụng bất kỳ phím nào trong options
mà Backbone sẽ sử dụng.
Một cách tiếp cận an toàn hơn sẽ được đính kèm một số tính chất bổ sung cho các mô hình:
model.baggage = { some: 'extra stuff };
và sau đó bóc rằng tắt trong callback:
triggerthis: function(model, collection) {
var baggage = model.baggage;
delete model.baggage;
//...
}
Demo: http://jsfiddle.net/ambiguous/M3UaH/
Bạn cũng có thể sử dụng các cuộc gọi lại khác nhau cho các mục đích khác nhau hoặc chuyển thông số bổ sung của bạn ers là thuộc tính mô hình thổi hoàn toàn.
Ngoài ra còn có _.bind
:
this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want'));
nhưng điều đó sẽ ràng buộc đối số từ trái sang phải, do đó bạn sẽ phải chỉ định tất cả các đối số mà gọi lại của bạn sẽ cần.
Demo: http://jsfiddle.net/ambiguous/jUpJz/
Kể từ khi 'triggerthis' xử lý sự kiện sẽ được gọi bởi mã sự kiện xương sống, nơi nào bạn mong đợi những phụ luận sẽ đến từ đâu? –
Xin lỗi nhưng tôi không chắc chắn cách thức hoạt động của nó. Tôi cho rằng tôi có thể gọi một hàm ẩn danh trong on() gọi triggerthis bên trong, nhưng tôi không chắc đây có phải là cách hay hay không. – chenglou