Events 在Backbone.View中动态添加事件处理程序的最佳方法是什么?
在我以前的项目中,我使用了1.1.2版的Backbone.js,Events 在Backbone.View中动态添加事件处理程序的最佳方法是什么?,events,backbone.js,backbone-views,Events,Backbone.js,Backbone Views,在我以前的项目中,我使用了1.1.2版的Backbone.js,Backbone.View定义为 var View = Backbone.View = function(options) { this.cid = _.uniqueId('view'); options || (options = {}); _.extend(this, _.pick(options, viewOptions)); this._ensureElement(); this.in
Backbone.View
定义为
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
options || (options = {});
_.extend(this, _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
this.delegateEvents();
};
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
_.extend(this, _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
};
当我将主干更新到最新版本(1.2.3)时,现在Backbone.View
被定义为
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
options || (options = {});
_.extend(this, _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
this.delegateEvents();
};
var View = Backbone.View = function(options) {
this.cid = _.uniqueId('view');
_.extend(this, _.pick(options, viewOptions));
this._ensureElement();
this.initialize.apply(this, arguments);
};
区别在于delegateEvents
现在被移动到setElement
方法,因此我无法动态更改
主干的事件
属性。查看
。但在某些情况下,我认为需要动态更改事件,例如,
我有一个文件行视图
,它扩展了主干。视图
表示文件信息,其模板html字符串是:
<li>
<h3 class="title">File name</h3>
<p>File description </p>
</li
但是在新版本的Backbone.View
中,由于delegateEvents
已添加到setElement
方法中,如何在events
属性中动态添加事件处理程序
在版本1.2.0中,变更文档中说:
视图现在总是在setElement中委托它们的事件。您不能再在initialize中修改事件哈希或视图的el属性
我不知道为什么?我会稍微扭转这个问题,使用你已经拥有的工具,而不是强迫他们按照你认为应该的方式工作 例如,您可以使模板如下所示:
<h3 class="title <%= is_clickable ? 'clickable' : '' %>">File name</h3>
<p>File description</p>
或者,如果您需要更具体的信息:
events: {
'click .title.clickable': '_titleClickHandler'
}
现在,您不必做任何奇怪或依赖于版本的事情,也不必与框架抗争。谢谢。当然,通过这种方式,我们可以解决这个问题,但是对于这个问题,我也可以使用initialize方法中的jQuery.on()方法来动态地添加事件处理程序,在我看来,框架的存在是为了处理常见的代码设计模式问题。我们应该让我们的代码更清晰易读。为什么要在上使用jQuery的
?我的答案是,用一种惯用的方法来做这类事情。我甚至想说,使用一个额外的类也是使用普通jQuery的正确方法,它甚至可以通过CSS改变光标。你想做的有点奇怪。是的,考虑到最新的主干框架,我知道你的方式可能是做这项工作的最佳方式。但问题是,即使在某些情况下我完全不需要事件委托,您也需要添加事件委托;TableViewB-->FileRowView,在TableViewA中标题是可点击的,在TableViewB中标题是不可点击的,如果我想重用FileRowView并在TableViewB中使用它,我必须添加一个不需要的委托事件并传递其他可点击的标志。那又怎样?这有什么明显的关系吗?如果重要的话,请对可单击行和不可单击行使用单独的视图,而不要试图混淆标志。