Связывание нескольких типов событий в представлениях на основе магистрали
Мне было интересно, возможно ли связать несколько типов событий в магистрали в пределах одной строки.
Рассмотрим следующее:
var MyView = Backbone.View.extend({
id: 'foo',
events: {
'click .bar': 'doSomething',
'touchstart .bar': 'doSomething'
},
doSomething: function(e) {
console.log(e.type);
}
});
В принципе, мне интересно, возможно ли комбинировать привязку события для 'click' и 'touchstart' в одной строке - вдоль строк:
events: { 'click,touchstart .bar': 'doSomething' }
Любые предложения будут оценены.
Ответы
Ответ 1
Для всех, кого это интересует, я переопределял delegateEvents
в Backbone.View.
Для получения желаемой функциональности есть только несколько модифицированных строк.
Вы можете увидеть diff в моей фиксации на github
Здесь delegateEvents
в его измененном состоянии:
delegateEvents: function(events) {
if (!(events || (events = getValue(this, 'events')))) return;
this.undelegateEvents();
for (var key in events) {
var method = events[key];
if (!_.isFunction(method)) method = this[events[key]];
if (!method) throw new Error('Method "' + events[key] + '" does not exist');
var match = key.match(delegateEventSplitter);
var eventTypes = match[1].split(','), selector = match[2];
method = _.bind(method, this);
var self = this;
_(eventTypes).each(function(eventName) {
eventName += '.delegateEvents' + self.cid;
if (selector === '') {
self.$el.bind(eventName, method);
} else {
self.$el.delegate(selector, eventName, method);
}
});
}
}
Ответ 2
Невозможно просмотреть события jQuery, которые связаны через delegateEvents
. возможно для базовых событий:
book.on("change:title change:author", ...);
Ответ 3
Мы могли бы также сделать это, как показано ниже.
Преимущество управления пространством между каждым событием.
Github совершить здесь
Добавьте его непосредственно в Backbone:
delegateEvents: function(events) {
events || (events = _.result(this, 'events'));
if (!events) return this;
this.undelegateEvents();
for (var key in events) {
var method = events[key];
if (!_.isFunction(method)) method = this[method];
if (!method) continue;
var match = key.match(delegateEventSplitter);
this.delegate(match[1], match[2], _.bind(method, this));
}
return this;
}
Переопределить метод delegateEvents:
Backbone.View.prototype.originalDelegateEvents = Backbone.View.prototype.delegateEvents;
Backbone.View.prototype.delegateEvents = function(events) {
events || (events = _.result(this, 'events'));
if (!events) return this;
this.undelegateEvents();
for (var key in events) {
var method = events[key], combinedEvents = key.split(',');
if (!_.isFunction(method)) method = this[method];
if (!method) continue;
for(var i = 0, match = null; i < combinedEvents.length; ++i) {
match = combinedEvents[i].trim().match(/^(\S+)\s*(.*)$/);
this.delegate(match[1], match[2], _.bind(method, this));
}
}
return this;
};
Теперь мы можем управлять событиями в одной строке:
events: {
'click a[data-anchor], wheel, keydown': 'scroll'
}