我最近创建了一个绑定处理程序,使用数据绑定语法将JQueryValidation插件合并到表单中。我发现自己需要向处理者提供不止一条信息。我需要提供一个标志来强制验证,并在验证通过后提供一个回调。
问题:
-
提供多个参数的最佳做法是什么?我只是依赖对象表示法语法,但也可以提供另一个绑定,并通过传递给处理程序的"allBindings"参数检查该绑定。。。
-
向处理程序提供回调函数的最佳实践是什么?
下面是定义处理程序的js代码和应用处理程序的html代码:
<form id="step1"
data-bind="jqValidation:{enforce: true,
submitHandler: doSomethingInVM}">
<fieldset data-bind="with:searchRequest">
//fields
</fieldset>
<button type="submit">submit</button>
</form>
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');
}
};
这里的方法遵循KO本身使用的模式,所以我认为它是完全有效的。假定您也可以使用allBindingsAccessor。我解释这种方法用法的方式是
- 在多个绑定之间共享属性,例如,可以使用bubbleEvent绑定向处理事件的任何其他绑定指示不要对事件进行冒泡
- 允许复杂的绑定处理程序了解其他绑定并调整其行为
传递处理程序的最佳实践是将它们作为视图模型上的命名成员,而不是绑定上的内联成员。
要回答这两个问题,强烈建议在使用knockoutjs和MVVM模式时,将与对象相关的属性和方法封装在它们各自的视图模型中。
也就是说,将负责更新视图模型(或由于视图模型的更改而触发对其他对象的更新)的任何属性(参数,如果愿意的话)和回调方法驻留在视图模型本身上,效果非常好。
然后,在自定义绑定处理程序中,您可以直接从视图模型中引用所需的任何属性,并调用驻留在视图模型上的任何回调函数。
以这种方式封装成员和行为使得单元测试每个视图模型也变得非常简单。