1

変更がある場合に変更を保存するようにユーザーに促したいフォームがあります。jQuery 遅延オブジェクトで jQuery UI ダイアログ ボックスを使用しようとしていますが、奇妙な動作が見られます。これが私がやっていることです:

function clickEventHandler()
{
  if (checkForChanges())
  {
    $.when(dialogChanges()).then(clickEventHandler());
    return;
  }
};
function dialogChanges()
{
  var def;

  def = $.Deferred();
  $("#tmplUnsavedChanges").tmpl().appendTo("body");
    this.__dialog = $("#divUnsavedChanges").dialog({
      resizable: false,
      modal: true,
      buttons: {
      Continue: Function.createDelegate(this, function ()
      {
        this.__origTemplate = this.__newTemplate;
        this.__dialog.dialog("close");
        def.resolve();
      }),
      Cancel: Function.createDelegate(this, function ()
      {
        this.__dialog.dialog("close");
        def.reject();
      })
    }
  });

  return def.promise();  
}

そのため、リンクをクリックすると関数が呼び出されます。変更があるかどうかを確認し、変更がある場合は、延期された promise を返すダイアログを起動します。しかし、私が見つけたのは、競合状態になるとすぐに完了関数を常に呼び出すことです。ただし、代わりにこの方法で呼び出すと、機能します。$.when(dialogChanges()).then(function() { clickEventHandler()});なぜでしょうか?then() 内の呼び出しを Function.createDelegate でラップすることも試みましたが、それも機能しません。

done hereの指示を読むと、パラメーター自体の中で関数を作成するのではなく、関数を取るように見えます。

とにかく、動作するのでそのままにしておいても問題ありませんが、理解したかったので、後で間違いを犯さないようにしました。

ありがとう。

4

1 に答える 1