gpt4 book ai didi

javascript - Backbone subview 事件未触发

转载 作者:行者123 更新时间:2023-11-29 18:10:01 24 4
gpt4 key购买 nike

出于某种原因,我的 View 事件没有触发,我不知道出了什么问题...

代码如下:

TasksView = ****.Views.BaseView.extend({
id: 'log-container',
className: 'row-fluid',
initialize : function(){
this.task_selection_view = new TaskSelectionView();
},
remove : function(){
this.task_selection_view.remove();
Backbone.View.prototype.remove.call(this);
},
render : function(){
$(this.el).html(Templates['log/log']);
$('#selection',this.el).append(this.task_selection_view.render().el);
return this;
}
});


TaskSelectionView = ****.Views.BaseView.extend({
className : 'row-fluid',
events : {
'click #fire' : 'fire'
},
render: function(){
$(this.el).html(Templates['log/task_selection']);
return this;
},
fire : function(event){
event.preventDefault();
console.log('fire');
}
});

日志模板:

<div id="selection"></div>

task_selection 模板:

<button id="fire" class="btn btn-default">fire</button>

我尝试了很多东西,但无法理解问题是什么......

最佳答案

发生这种情况是因为您在不知不觉中解除了 subview 事件的绑定(bind)。对 jQuery 的 .html() 的调用将在后台调用 .empty(),这将分离绑定(bind)到( subview 的)元素的任何 DOM 事件。

这就是调用 this.delegateEvents() 时问题得以解决的原因。您可以通过调用 subview.setElement() 优雅地解决这个问题,它会为您调用 .delegateEvents()

在您的主视图中,只需替换:

$('#selection',this.el).append(this.task_selection_view.render().el);

与:

this.task_selection_view.setElement(this.$('#selection')).render();

这是上下文中的那一行(参见 render 函数):

TasksView = ****.Views.BaseView.extend({
id: 'log-container',
className: 'row-fluid',
initialize: function () {
this.task_selection_view = new TaskSelectionView();
},
remove: function () {
this.task_selection_view.remove();
Backbone.View.prototype.remove.call(this);
},
render: function () {
$(this.el).html(Templates['log/log']);
this.task_selection_view.setElement(this.$('#selection')).render();
return this;
}
});

进一步阅读

关于javascript - Backbone subview 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com