我正在开发一个 SPA 应用程序,其中 Backbone.js 是架构的主要部分。
我们也有一些 Twitter Bootstrap 风格,其中有 Button 组[1]。所以 html 有这些按钮作为复选框或单选。
为了通过使用 Backbone.ModelBinder[2] 将 Backbone 模型透明地绑定到包含这些按钮的 Backbone 视图,我修改了以下代码:
# Twitter Bootstrap compatibility
addButtonGroupModelBindingSupport = ->
$(@el).one 'mousedown keydown', '.btn-group[data-toggle="buttons-radio"] button', ->
$(@).closest('.btn-group').find('button').prop 'type', 'radio'
installTwitterBootstrapModelBindingSupport = ->
backboneView = Backbone.View
ButtonGroupModelBinderSupportView = Backbone.View.extend
constructor: ->
backboneView.apply @, arguments
addButtonGroupModelBindingSupport.call @
return
Backbone.View = ButtonGroupModelBinderSupportView
installTwitterBootstrapModelBindingSupport()
此代码在导出 ModelBinder 的模块内部,因此只执行一次。我在 Backbone.View 中混合了我需要的行为,因此以一种不显眼的方式注入了似是而非的 JavaScript。
所以我告诉那些按钮它们不再是按钮了。据我所知,Chrome Firefox 和 IE 都可以。
被愚弄了,ModelBinder 将按钮正确地处理为复选框或单选框,并且一切都按需要工作。
如果这个 hack 看起来太棘手,那么听取更有经验的前端开发人员的意见会很棒。
[1] http://twitter.github.com/bootstrap/components.html#buttonGroups