我的项目中定义了一个视图:
define(['jquery', 'underscore', 'backbone', 'eventbus', 'text!templates/traveller.html'], function($, _, Backbone, bus, html) {
var TravellerView = Backbone.View.extend({
initialize: function() {
_.bindAll(this);
this.render();
},
template: _.template(html),
render: function() {
// code omitted..
this.$el.html(this.template({
slices: datesSliced,
segmentName: this.options.segmentName,
currentDate: this.options.currentDate
}));
console.log('rendered at: ' + new Date().toString());
return this;
},
events: {
'click a.handle-prev': 'showPrevious',
'click a.handle-next': 'showNext'
},
showNext: function(e) {
e.preventDefault();
console.log('nothing happens');
}
...
Render()
只被调用一次 - 至少在 Chrome 控制台中只有一条消息。
对应的模板如下所示:
<ul><!-- things are omitted.. --></ul>
<a href="#" class="handle-prev"><i class="icon-chevron-left icon-3x"></i></a>
<a href="#" class="handle-next"><i class="icon-chevron-right icon-3x"></i></a>
问题是点击<a class="handle-next">
或触发事件 ( $('a.handle-next').trigger('click')
) 都不会手动触发showNext
处理程序。
我玩过return false
, stopPropagation()
, preventDefault()
,stopImmediatePropagation()
甚至设置javascript:void(0)
为href值。
我如何诊断出了什么问题?就像事件处理程序被完全忽略或分离。
编辑。事件哈希
我在帮助下检查了视图的事件哈希
showEventsHash: function() {
console.log(_.result(this, 'events'));
}
它不是空的:在 Chrome 控制台中可以看到