首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用引导模式作为Backbone.js视图

使用引导模式作为Backbone.js视图
EN

Stack Overflow用户
提问于 2012-01-11 06:53:49
回答 1查看 16.1K关注 0票数 31

我正在尝试创建一个基于Twitter bootstrap-modal的Backbone.js视图,它通过视图的events属性利用Backbone的自动事件委派。

不幸的是,bootstrap-modal似乎破坏了Backbone的事件委托,因为它在显示模式之前克隆了视图HTML:

代码语言:javascript
复制
that.$element
      .appendTo(document.body)
      .show()

我的观点是:

代码语言:javascript
复制
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模板:

代码语言:javascript
复制
<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都不会被调用。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-13 05:41:17

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

代码语言:javascript
复制
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)可用于访问控制模式的对象,例如,以编程方式隐藏它。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8811735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档