Backbone: 親イベントの継承方法(events, initialize プロパティでの継承)
まずは Backbone で書いたこんなコードがあります。
var App = { View: {} };
App.View.Hoge = Backbone.View.extend({
events: {
'click #hello': 'hello'
},
hello: function() {
alert('Hello!');
}
});
これを動かすと、当然、以下のように Hello!
ボタンをクリックすることでアラートが表示されます。
次に、この App.View.Hoge
を継承して新しい App.View.Fuga
を作ります。
App.View.Fuga = App.View.Hoge.extend({
events: {
'click #thankyou': 'thank'
},
thank: function() {
alert('Thank you!');
}
});
var FugaView = new App.View.Fuga({ el: '#hello-application' });
これを動かしてみると、Hello!
ボタンをクリックしてもアラートが表示されません。
しかし、新しく定義した Thank you!
ボタンは指定したアラートが表示されます。
親のイベントを継承するには、events
プロパティに以下のように書くことで実現可能です。
App.View.Fuga = App.View.Hoge.extend({
events: function() {
return _.extend({}, App.View.Hoge.prototype.events, {
'click #thankyou': 'thank'
});
},
thank: function() {
alert('Thank you!');
}
});
これで動かしてみると Hello!
ボタンも Thank you!
ボタンもアラートが表示されると思います。
他にも initialize
で継承する方法があります。
App.View.Fuga = App.View.Hoge.extend({
events: {
'click #thankyou': 'thank'
},
initialize: function() {
this.events = _.extend({}, App.View.Hoge.prototype.events, this.events);
},
thank: function() {
alert('Thank you!');
}
});
上記の2つ以外にも方法がありまして、originalEvents
プロパティと additionalEvents
プロパティを用意して events
プロパティでマージする方法もわかりやすいです。
また、さらに継承する際には、親の events
プロパティが Function
かどうかを判断する必要があったりします。
これらの方法については参考記事をみていただければ幸いです。