1

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);
  };
4

0 に答える 0