Knockout.js 淘汰自定义绑定处理程序-多参数和函数回调最佳实践?
我最近创建了一个绑定处理程序,使用数据绑定语法将JQuery验证插件合并到表单中。我发现自己需要向处理者提供不止一条信息。我需要提供一个标志来强制验证,并在验证通过后发出回调 问题:Knockout.js 淘汰自定义绑定处理程序-多参数和函数回调最佳实践?,knockout.js,jquery-validate,Knockout.js,Jquery Validate,我最近创建了一个绑定处理程序,使用数据绑定语法将JQuery验证插件合并到表单中。我发现自己需要向处理者提供不止一条信息。我需要提供一个标志来强制验证,并在验证通过后发出回调 问题: 提供多个arg的最佳实践是什么?我只依赖对象表示法语法,但也可以提供另一个绑定,并通过传递给处理程序的“allBindings”参数检查该绑定 向处理程序提供回调函数的最佳实践是什么 下面是定义处理程序的js代码和应用处理程序的html代码: <form id="step1" da
<form id="step1"
data-bind="jqValidation:{enforce: true,
submitHandler: doSomethingInVM}">
<fieldset data-bind="with:searchRequest">
//fields
</fieldset>
<button type="submit">submit</button>
</form>
为了回答这两个问题,在使用knockoutjs和MVVM模式时,强烈建议将与对象相关的属性和方法封装在各自的视图模型中 这就是说,将负责更新视图模型(或由于视图模型中的更改而触发对其他对象的更新)的任何属性(参数,如果愿意的话)和回调方法驻留在视图模型本身上非常有效 然后,在自定义绑定处理程序中,您可以直接从视图模型引用所需的任何属性,以及调用驻留在视图模型上的任何回调函数
以这种方式封装成员和行为使得对每个视图模型进行单元测试非常简单。这里的方法遵循KO本身使用的模式,因此我认为它是完全有效的。当然,您也可以使用allBindingsAccessor。我解释这种方法用法的方式是
传递处理程序的最佳实践是将它们作为视图模型上的命名成员,而不是在绑定上内联 谢谢,这也是我对allBindingsAccessor方法的想法。因此,在我的例子中,您是否会在数据绑定属性中传递处理程序?我会将它作为对象引用的一部分传递回您的VM,就像您所做的那样。你也可以把处理程序内联写出来,这很难看,被认为是不好的做法。啊,是的,我同意,我在我的第一个ko项目中犯了一些错误:)
ko.bindingHandlers.jqValidation = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var accessor = valueAccessor();
//need unwrapobservable??
if (accessor.enforce) {
$(element).find(':submit').removeClass('cancel');
$(element).validate({
submitHandler: function () {
if ($.isFunction(accessor.submitHandler))
accessor.submitHandler();
}
});
} else
$(element).find(':submit').addClass('cancel');
}
};