如何选择性地忽略淘汰赛,提交'捆绑?

时间:2014-12-16 08:00:30

标签: javascript jquery knockout.js

我有一个带有敲除绑定data-bind="submit: saveProfileChanges"的表单。 viewmodel函数saveProfileChanges调用以下新代码:

dataAccess.submitJsonWithFileRequestjQueryWithErrorFunction = function () {
    function uploadImageComplete() {
        // Hanlde response from image post.
    }
    $("#upload_iframe").load(function() {
        uploadImageComplete();
    });
    $("#userProfileForm").submit();
};

我已添加此代码以允许使用iframe回退为IE9上传伪ajax图像。我已经为这个上传尝试了jquery插件而没有成功,并且决定采用简单明了的方法风险较小,并尽量减少对我不了解的功能负载的影响。

问题是,我的上传方法中的submit调用会触发ko bound saveProfileChanges,这会再次调用我的上传功能,令人烦恼。有没有办法可以忽略我对submit本地电话的ko绑定?我不那么savouryu的替代方案是在忙于上传时在我的viewmodel中设置一个标志,所以saveProfileChanges只会返回而不做任何进一步的操作,直到我的上传完成。

1 个答案:

答案 0 :(得分:1)

这实际上是一个jQuery问题,而不是KO。将您的提交电话更改为:

$("#userProfileForm")[0].submit();
// Change -----------^^^

,例如,调用form元素submit而不是jQuery&#39}。 form元素的功能赢得再次触发submit事件,但是jQuery将会。

我认为你的表单提交是在一些异步任务(比如上传文件)之后发生的,否则你只想让saveProfileChanges返回true告诉KO允许默认操作(因为KO默认会自动阻止提交)。

以下是使用jQuery submitLive Copy

的问题的演示
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Example</title>
</head>
<body>
<form action="http://google.com/search">
  <input type="text" name="q" value="kittens">
  <input type="submit" value="Send">
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
(function() {
  var counter = 0;

  // Hook a handler to the form's submit event. Note that KO will
  // use jQuery to do this if jQuery is on the page, so we'll do it
  // via jQuery
  $("form").on("submit", function(e) {
    var form = this;

    // Note that we got the event
    ++counter;
    display("submit event received, counter = " + counter);

    // Simulate asynchronous task
    setTimeout(function() {
      // We limit the number of times we'll re-fire
      if (counter < 3) {
        alert("submitting form using jQuery's submit function (counter = " + counter + ")");
        $(form).submit();
      } else {
        alert("but now we'll submit it directly, not through jQuery");
        form.submit();
      }
    }, 10);

    // By default, KO will prevent the default, so do that
    e.preventDefault();
  });

  function display(msg) {
    $("<p>").html(String(msg)).appendTo(document.body);
  }
})();
</script>
</body>
</html>