【发布时间】:2012-02-07 08:44:16
【问题描述】:
我正在尝试基于 Twitter 引导模式创建一个 Backbone.js 视图,它通过视图的 events 属性利用 Backbone 的自动事件委托。
不幸的是,bootstrap-modal 似乎破坏了 Backbone 的事件委托,因为它在显示模式之前克隆了视图 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>
当相应的事件被触发时,save 和 shown 都不会被调用。
有什么想法吗?
【问题讨论】:
-
是否有某种“打开”回调可以用来用 HTML 填充模式?基本上绕过克隆(或者至少是克隆的一部分搞砸了
delegate)。 -
是的,参见。 twitter.github.com/bootstrap/1.4.0/bootstrap-modal.js。不幸的是,在克隆之前调用了 show 事件(由于原始问题,我没有得到显示的事件)。
-
shown事件怎么样? “当模式对用户可见时触发此事件(将等待 css 转换完成)。” -
好吧,当 HTML 片段被移动到 DOM 中的另一个位置 (
document.body) 后触发了shown事件,主干视图没有得到它的回调调用 (@el不再指向那里)。 -
你能创建模态,然后把主干视图放在里面吗?
标签: javascript backbone.js coffeescript twitter-bootstrap