Jquery validateを使用して検証をセットアップしようとしていますが、サーバーからビューモデルが返され、クライアントにマップされ、一部のデータをバインドするノックアウトjsが正常に実行されます。
検証するために呼び出されたものを含めましたが、検証がトリガーされることはありません。ただし、入力ボックスにクラスを配置してからvalidを呼び出すと、期待どおりにトリガーされます。
何か案は?
<script type="text/javascript">
var viewModel;
$(document).ready(function () {
$.ajax({
url: 'Home/GetUserData',
type: 'post',
success: function (data) {
viewModel = ko.mapping.fromJS(data);
viewModel.save = function () { sendToServer(); };
ko.applyBindings(viewModel);
main();
}
});
});
function main() {
$("form").validate({
rules: {
birthPlace: {
required: true,
minlength: 2
}
}
});
}
function sendToServer() {
alert($("form").valid());
}
</script>
}
<h2>@ViewBag.Message</h2>
<form id="nameSubmit" action="">
<div>
The name is: <span id="test" data-bind="text: Name"></span>
</div>
<div>
He's <span id="age" data-bind="text: Age"></span>
</div>
<div>
He's from
<input type="text" id="birthPlace" name="birthPlace"/>
</div>
<div>
<button data-bind="click: save">Click Me</button>
</div>
</form>
デフォルトでは、jQueryValidateは送信時に検証を行います。したがって、ノックアウトがそれを中断している場合、つまり実際にonSubmit
イベントをトリガーしない場合は、それが実行されます。あなたの最善の策は、sendToServer関数でいくらか計画していたようにすることかもしれません-ノックアウト送信イベントから手動で検証をトリガーします:
if (!$('form').valid()){
$('form').showErrors();
return false;
}
//otherwise, get on with whatever knockout needs to do
...
return true;
ノックアウトのjQuery検証バインディングがあります。これは非常に便利です。
ノックアウトでjQuery検証を使用しないことをお勧めします。その理由は、jQueryの検証がDOMにバインドするのに対し、ノックアウトはビューモデルでの作業を推奨しているためです。これにより、検証への依存関係を追加し始めると、データが無効な場合に特定の動作を防ぐなどの問題が発生しますが、それでもデータを保持する必要があります。 ノックアウト検証 に移動します。これは非常にうまく機能します。
私はvalidate()でsubmitHandlerオプションを使用しています:
$("#myform").validate({
submitHandler: function(form) {
viewModel.sendToServer()
}
});
フォームで、標準の<input type="submit">
を使用するだけで、jQuery検証がイベントを取得して検証し、有効な場合はviewModelでハンドラーを呼び出します。
JQuery Validationがフォーム送信イベントでのみ検証を行うのは正しいことです(Ryleyの回答による)。したがって、ifノックアウトスタイル_data-bind="click:modelSubmit"
_を使用すると、フォーム送信が(デフォルトで)実行されなくなり、jQuery検証が何も実行されなくなります。
2つのオプションがあります。 1つ目は、modelSubmit()
からtrue
を返すことです。これにより、Knockoutはフォームを送信します(ただし、afterのみ) modelSubmit
が終了しました)( http://knockoutjs.com/documentation/click-binding.html )。
2番目(そしておそらくあなたが望むもの)は、_data-bind="click"
_を完全に省略し、代わりにjQuery検証送信ハンドラーを使用することです( https://jqueryvalidation.org/validate )。
_$("#myform").validate({
submitHandler: function(form) {
viewModel.modelSubmit();
}
});
_
このハンドラーは、検証が成功した場合にのみ呼び出されます。