Knockout + Jqueryvalidation

我正在尝试使用jquery validate设置validation,并且我已经从服务器返回viewmodel,映射到客户端并成功地使knockout js绑定一些数据。

我包含了一个调用validation,但validation永远不会触发,但是如果我在输入框上放置一个类然后调用有效它触发按预期方式。

有任何想法吗?

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

@ViewBag.Message

The name is:
He's
He's from

默认情况下,jQuery Validate会在提交时进行validation。 因此,如果淘汰赛中断了这一点,即通过不实际触发onSubmit事件,就可以做到这一点。 您最好的选择可能是在您的sendToServer函数中进行一些计划 – 手动触发敲门提交事件的validation:

 if (!$('form').valid()){ $('form').showErrors(); return false; } //otherwise, get on with whatever knockout needs to do ... return true; 

现在有一个淘汰jQueryvalidation绑定,我觉得非常有用:

https://github.com/Knockout-Contrib/Knockout-Validation

我想建议不要使用joutvalidation和淘汰赛。 原因是jQueryvalidation绑定到DOM,而knockout建议使用视图模型。 一旦您开始在validation中添加更多依赖项,这将导致问题,例如,如果数据无效,则阻止某些行为,但您仍需要保留数据。 去淘汰validation ,它做得很好。

我一直在validate()上使用submitHandler选项:

 $("#myform").validate({ submitHandler: function(form) { viewModel.sendToServer() } }); 

在表单上,​​只需使用标准 ,jQueryvalidation将获取事件,validation,如果有效,将在viewModel上调用您的处理程序。

jQuery Validation只对表单提交事件进行validation是正确的(根据Ryley的回答)。 因此, 如果您使用Knockout样式data-bind="click:modelSubmit"这将阻止表单提交(默认情况下),因此阻止jQuery Validation执行任何操作。

你有两个选择。 第一种是从modelSubmit()返回true ,这将使Knockout触发表单提交(但仅 modelSubmit完成后)( http://knockoutjs.com/documentation/click-binding.html )。

第二个 – 也许你想要的 – 是完全不使用data-bind="click"而是使用jQuery Validation提交处理程序( https://jqueryvalidation.org/validate )。

 $("#myform").validate({ submitHandler: function(form) { viewModel.modelSubmit(); } }); 

只有在validation成功后才会调用此处理程序。