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
默认情况下,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绑定,我觉得非常有用:
我想建议不要使用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成功后才会调用此处理程序。