Bootstrap Dropdown を拡張しようとしています。Bootstrap Modal を拡張するときに使用したのと同じ方法を使用していますが、どういうわけかドロップダウンでは機能しないようです。私はBSコードを読みましたが、これら2つの明らかな違いを見つけることができませんでした.
_tgl = $.fn.dropdown.Constructor::toggle
$.fn.dropdown.Constructor::toggle = ->
alert('foo')
_tgl.apply(this, arguments)
_show = $.fn.modal.Constructor::show
$.fn.modal.Constructor::show = ->
alert('bar')
_show.apply(this, arguments)
以下のコードは正常に動作します。モーダルを開くとアラートが表示され、ドロップダウンを切り替えても何も起こりません。BS ドロップダウンのベース トグルにアラートを挿入すると、アラートが表示され、ベース メソッドが呼び出され、オーバーライドがスキップされます... 何か考えはありますか?
ここでの 2 番目の質問は、なぜ super がここで機能しないのかということです。例えば:
$.fn.dropdown.Constructor::toggle = ->
alert('foo')
super
私が理解している限り、ドキュメントには、スーパーが親メソッドを呼び出すと記載されていましたが、「インスタンスメソッドの外でスーパーを呼び出すことはできません」というコンパイルエラーが発生します。クラスメソッドをオーバーライドしていても、クラスコンテキストの外でスーパーを使用できないということですか?
PS: コーヒースクリプトに慣れていない人のために、最初の例のコンパイル済み JS コードを次に示します。
_tgl = $.fn.dropdown.Constructor.prototype.toggle;
$.fn.dropdown.Constructor.prototype.toggle = function() {
alert('foo');
_tgl.apply(this, arguments);
};
_show = $.fn.modal.Constructor.prototype.show;
$.fn.modal.Constructor.prototype.show = function() {
alert('foo');
_show.apply(this, arguments);
};