変更がある場合に変更を保存するようにユーザーに促したいフォームがあります。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の指示を読むと、パラメーター自体の中で関数を作成するのではなく、関数を取るように見えます。
とにかく、動作するのでそのままにしておいても問題ありませんが、理解したかったので、後で間違いを犯さないようにしました。
ありがとう。