2012-06-24 36 views
14

Trước hết, tôi đã thực hiện một số tìm kiếm và không có câu trả lời trên stackoverflow/google đã cung cấp cho tôi điều tôi muốn.Truyền đối số cho các sự kiện trong xương sống

Dưới đây là một đoạn mã của tôi:

//in the view 
this.collection.on("add",triggerthis) 
this.collection.add(predefinedModel) 
triggerthis: function(a, b, c, d){ 
    //etc. 
} 

Về cơ bản, tôi muốn để có thể vượt qua một cuộc tranh cãi về add và nhận lập luận trong triggerthis. Điều này có thể không?

Xin cảm ơn trước.

+1

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? –

+0

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

Trả lời

30

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/

+0

upvote - giống như kỹ thuật hành lý - hoạt động tốt! cám ơn – sambomartin

6

Nếu các giá trị truyền cho hàm là luôn luôn giống nhau, bạn có thể partially apply nó bằng cách sử _.bind (hoặc mẹ đẻ Function.bind nếu có)

Ví dụ: Trong trường hợp bạn đang ràng buộc xử lý để add (giả sử triggerThis là một phương pháp theo quan điểm của bạn):

this.collection.on('add', _.bind(this.triggerThis, this, a, b, c, d)); 

Định nghĩa của triggerThis:

triggerThis: function(a, b, c, d /*, model, collection, options - if you need them*/) { 
    ... 
} 

Nếu bạn muốn truyền tham số cho một cá nhân thêm cuộc gọi, bạn có thể sử dụng tham số options thứ hai để add và sau đó xử lý điều đó trong trình xử lý sự kiện của bạn.

Ví dụ:

this.collection.on('add', this.triggerThis, this); 
this.collection.add(model, { 
    someCustomValue: 'hello'; 
}); 

Sau đó, trong xử lý của bạn:

triggerThis: function(model, collection, options) { 
    var val = options.someCustomValue; 
    ... 
} 
+0

Vấn đề là đối số 'tùy chọn' thứ ba không được ghi lại chính xác. –

+0

Đúng, mặc dù trong một trong các mục nhập thay đổi (cho 0.9.0) nó đề cập rằng "Trong một bộ sưu tập thêm và loại bỏ các sự kiện, chỉ số của mô hình được thêm vào hoặc loại bỏ bây giờ có sẵn như options.index." vì vậy tôi cho rằng nó có lẽ sẽ không biến mất sớm. – jimr

+0

Đối số 'tùy chọn' đối với các cuộc gọi lại là một vùng màu xám, các loại tài liệu nói xung quanh nó mà không cần phải nói ngay rằng nó ở đó. Tôi nghi ngờ rằng nó sẽ được hợp pháp hóa tại một số điểm. Tôi chỉ mặc dù nó là đáng nói đến là có một số cảnh báo. –

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