0

私が達成しようとしていることは次のとおりです。

ポップアップを開くリンクがありますが、そのポップアップではデータベース レコードのデータを編集できるため、ポップアップを開く前にデータベース レコードがロックされているかどうかを確認したいと考えています。また、データベース レコードがロックされている場合は、ポップアップの代わりにメッセージをユーザーに表示する必要があります。

私のアイデアは、次のようなカスタム イベントをトリガーして、任意のリスナーがポップアップを開くのを停止できるようにすることでした。

$(".popuplauncher").on("click", function(event) {
  event.preventDefault();  // Stop the default click action: opening the popup
  var myCustomEvent = $.Event("myCustomEvent");
  $(this).trigger(myCustomEvent);
  if (myCustomEvent.isDefaultPrevented()) {
    // Show message 'database object locked'
  } else {
    // Everything ok, open the popup
  }
});

しかし、イベント リスナーには非同期動作 (データベース オブジェクトがロックされているかどうかをサーバーに問い合わせる) があるため、イベント リスナーでは遅延オブジェクトを使用する必要があると思います。

$.when($(this).trigger(myCustomEvent)).then(...)

trigger() は遅延オブジェクトを返さないため、機能しません。連鎖を可能にするために JQuery オブジェクト自体を返します。

$.when($(this).triggerHandler(myCustomEvent)).then(...)

triggerHandler() は最後のイベントハンドラーの値のみを返すため、私にとってもトリックは行いません。したがって、複数のイベント ハンドラーがある場合、最後のハンドラー以外はすべて無視されます。

私はここで正しい軌道に乗っていますか、それともこの問題に対して別のアプローチを取るべきですか? 私に言わせれば、これはよくある問題だと思います。そのため、簡単ですぐに使用できるソリューションを見落としていたことを願っています。

これは、いろいろいじりながら作ったフィドルtriggerHandler()です。最後のハンドラ/遅延のみが重要であることに注意してください。

4

0 に答える 0