【问题标题】:jQuery deferred object with dialog带有对话框的 jQuery 延迟对象
【发布时间】:2013-05-23 19:33:28
【问题描述】:

我有一个表单,如果有更改,我想提示用户保存更改。我正在尝试将 jQuery UI 对话框与 jQuery 延迟对象一起使用,但我看到了一些奇怪的行为。这就是我正在做的事情:

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

所以当我点击一个链接时我会调用一个函数。它检查是否有更改,如果有,它会启动返回延迟承诺的对话框。但我发现它总是会立即调用 done 函数进入竞争状态。但是,如果我改为这样称呼它,它就可以工作。 $.when(dialogChanges()).then(function() { clickEventHandler()}); 为什么会这样?我也尝试使用 Function.createDelegate 将调用包装在 then() 中,但这也不起作用。

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

无论如何,我可以保持原样,因为它有效,但只是想理解,所以我不会在路上犯错。

谢谢。

【问题讨论】:

    标签: jquery jquery-ui jquery-deferred


    【解决方案1】:

    您的代码非常几乎是正确的。您需要从以下位置删除多余的大括号:

    .then(clickEventHandler())
    

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

    .then(clickEventHandler)
    

    【讨论】:

    • 感谢 Alnitak。顺便说一句,是您对另一个问题的回答首先向我展示了如何做到这一点。干杯!
    • @griztown 不客气!很高兴看到以前的答案也有帮助。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多