javascript - 使用 bootstrap-modal 作为 Backbone.js View

标签 javascript backbone.js coffeescript twitter-bootstrap

我正在尝试创建一个基于 Twitter Bootstrap 模式的 Backbone.js View ,它通过 View 的 events 属性使用 Backbone 的自动事件委托(delegate)。

不幸的是,bootstrap-modal 似乎破坏了 Backbone 的事件委托(delegate),因为它在显示模态之前克隆了 View HTML:

that.$element
      .appendTo(document.body)
      .show()

我的看法:

App.Views.ProjectsNav ||= {}

class App.Views.ProjectsNav.NewProjectView extends Backbone.View
  events: {
    'click .save': 'save',
    'shown':       'shown'
  }

  save: (e) ->
    ...
    false

  shown: () ->
    App.Helpers.Forms.setFocus($(@el), true)
    false

  render: () ->
    $(@el).html(ich.nav_edit_project_template(@model.toJSON()))
    @$('.modal').modal({'show': true, 'keyboard': true, 'backdrop': true})
    @

对应的(Mustache)HTML模板:

<div class="modal hide" style="display: none; ">
  <div class="modal-header">
    <a href="#" class="close">×</a>
    <h3>New Project</h3>
  </div>
  <div class="modal-body form-stacked">
    <label for="name">Name</label> <input type="text" name="name" value="{{name}}"/><input type="hidden" name="lock_version" value="{{lock_version}}"/>
  </div>
  <div class="modal-footer">
    <a href="javascript:void(0)" class="save btn primary">Create</a>
    <a href="javascript:void(0)" class="cancel btn secondary">Cancel</a>
  </div>
</div>

当相应的事件被触发时,saveshown 都不会被调用。

有什么想法吗?

最佳答案

好吧,所以解决方案很简单:

App.Views.ProjectsNav ||= {}

class App.Views.ProjectsNav.NewProjectView extends Backbone.View
  tagName: 'div'

  events: {
    'click .save':   'save',
    'click .cancel': 'hide',
    'hidden':        'hidden',
    'shown':         'shown'
  }

  initialize: (options) ->
    super(options)
    @collection = options.collection

  hide: () ->
    @el.modal(true).hide()
    false

  save: (e) ->
    ...
    @model.save(attrs, {
      success: (project) =>
        @model = project
        @collection.add(@model)
        @hide()
      error: (project) =>
        alert('Something went wrong: ' + project)
      }
    )
    false

  render: () ->
    @el = ich.nav_edit_project_template(@model.toJSON()).modal('keyboard': true, 'backdrop': true)
    @delegateEvents()
    @el.modal('show': true)
    @

  hidden: () ->
    @remove()
    false

  shown: () ->
    App.Helpers.Forms.setFocus($(@el), true)
    false

总结一下,关键是将模态显示分成两个步骤,从而可以分配 @el 并在之后调用 @delegateEvents() 使其可见. @el.modal(true) 可用于访问控制模态的对象,例如以编程方式隐藏它。

关于javascript - 使用 bootstrap-modal 作为 Backbone.js View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811735/

相关文章:

javascript - 更改 nvd3 图表中的边距和填充

javascript - 高阶组件上的 PropTypes

javascript - 使用自定义布局和具有主干表单的可变字段数

javascript - 如何在服务器端构建 Node、Express、Connect-Auth 和 Backbone 应用程序?

CoffeeScript 重构

coffeescript - 为什么我不能调用这个函数?

javascript - 将行添加到表中时更改数字列

javascript - react-native 访问手机摄像头

javascript - 如何将 .show() 更改为 .toggle() 而不重复函数中的项目(我如何重构)

javascript - 无法在文件外访问 coffeescript 函数