view.events からの走査が、モバイル端末だと #id を使っても遅いので、
Viewを破壊しない場合はDOMへ固定してしまうことにしました。
その際に events の設定をそのまま使えるようにするためのメソッド。
ほとんど Backbone.View.delegateEvents (v1.0.0) のコピィです。
Coffee である必要はありません。
delegateEventsFixedly: (events) ->
return `(function(){
if (!(events || (events = _.result(this, 'events')))) return this;
this.undelegateEvents();
for (var key in events) {
var method = events[key];
if (!_.isFunction(method)) method = this[events[key]];
if (!method) continue;
// Changed
var match = key.match(/^(\S+)\s*(.*)$/);
// /Changed
var eventName = match[1], selector = match[2];
method = _.bind(method, this);
eventName += '.delegateEvents' + this.cid;
if (selector === '') {
this.$el.on(eventName, method);
} else {
// Changed
this.$(selector).on(eventName, method);
// /Changed
}
}
return this;
}).call(this);`
view.initialize
で元の delegateEvents
が実行されるのは仕方ないので、
その後にどこかで実行します。
もちろん undelegateEvents
で消すことは可能です。