バックボーンのソースをハッキングしましたが、これを改善するための提案を探しています。
メソッドのソースは次のdelegateEvents
とおりです。
delegateEvents: function (events) {
if (!(events || (events = _.result(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 eventName = match[1],
selector = match[2];
method = _.bind(method, this);
eventName += '.delegateEvents' + this.cid;
if (selector === '') {
this.$el.on(eventName, method);
} else {
this.$el.on(eventName, selector, method);
}
}
},
これが私がハッキングしたものです(まだ本番環境の準備ができていませんよね?):
delegateEvents: function (events) {
if (!(events || (events = _.result(this, 'events')))) return;
this.undelegateEvents();
for (var key in events) {
var method = events[key];
var special = false;
if (method.indexOf('REF->') != -1) {
special = true;
} else {
if (!_.isFunction(method)) method = this[events[key]];
if (!method) throw new Error('Method "' + events[key] + '" does not exist');
}
var match = key.match(delegateEventSplitter);
var eventName = match[1],
selector = match[2];
if (!special) method = _.bind(method, this);
eventName += '.delegateEvents' + this.cid;
if (selector === '') {
if (!special) this.$el.on(eventName, method);
} else {
if (special) {
var specialMethod = method.replace('REF->', '');
eval('this.$el.on(eventName, selector, ' + specialMethod + ');');
} else {
this.$el.on(eventName, selector, method);
}
}
}
},
ユースケース:
ビューからロジックを削除するか、ビュー外の関数にリダイレクトするだけでした。理由は簡単です。ビューだけでなく、ページの観点から考えているのです。これを容易にするために、マリオネット レイアウトを実際に使用しています。各レイアウトには複数のビュー チャンクが含まれており、ページ上のすべてのビュー委任を 1 か所にまとめたいと考えていました。
したがって、これが標準の場合:
View = Backbone.View.extend({
events: {
"click li.foo": "fooSelected"
},
fooSelected: function (e) {
}
});
ハックは次のように機能します。
View = Backbone.View.extend({
events: {
"click li.foo": "REF->MyApp.Page.fooSelected"
}
});
先に進む前に、これを分離するより良い方法はありますか?