Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 在Backbone.View中动态添加事件处理程序的最佳方法是什么?_Events_Backbone.js_Backbone Views - Fatal编程技术网

Events 在Backbone.View中动态添加事件处理程序的最佳方法是什么?

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

在我以前的项目中,我使用了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.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中使用它,我必须添加一个不需要的委托事件并传递其他可点击的标志。那又怎样?这有什么明显的关系吗?如果重要的话,请对可单击行和不可单击行使用单独的视图,而不要试图混淆标志。