jQuery延迟对象与对话框

时间:2013-05-23 19:33:29

标签: jquery jquery-ui jquery-deferred

我有一个表单,我想提示用户保存更改,如果有更改。我正在尝试使用带有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.createDelegate在then()中包装调用,但这也不起作用。

当我阅读完成here的说明时,它似乎采用函数而不是在参数本身内创建函数。

无论如何,我很好,因为它可以正常工作,但只是想了解所以我不会在路上犯错误。

感谢。

1 个答案:

答案 0 :(得分:3)

您的代码非常几乎是正确的。你需要删除额外的一对大括号:

.then(clickEventHandler())

因为您当前正在立即调用该函数,并将其结果传递给.then,而不是注册 clickEventHandler作为.then回调,即:

.then(clickEventHandler)
相关问题