我有一个带有敲除绑定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
只会返回而不做任何进一步的操作,直到我的上传完成。
答案 0 :(得分:1)
这实际上是一个jQuery问题,而不是KO。将您的提交电话更改为:
$("#userProfileForm")[0].submit();
// Change -----------^^^
,例如,调用form
元素submit
而不是jQuery&#39}。 form
元素的功能赢得再次触发submit
事件,但是jQuery将会。
我认为你的表单提交是在一些异步任务(比如上传文件)之后发生的,否则你只想让saveProfileChanges
返回true
告诉KO允许默认操作(因为KO默认会自动阻止提交)。
以下是使用jQuery submit
:Live 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>