Knockout自定义绑定处理程序 - 多个参数和函数回调最佳实践?

时间:2012-03-07 16:03:56

标签: knockout.js jquery-validate

我最近创建了一个绑定处理程序,使用数据绑定语法将JQuery Validation插件合并到一个表单中。我发现自己需要向处理程序提供多条信息。我需要提供一个标志来强制执行验证,并在验证通过后触发一个回调。

问题:

  1. 提供多个args的最佳做法是什么?我只是依赖于对象表示法语法,但也可以提供另一个绑定并检查通过传递给处理程序的“allBindings”参数绑定...

  2. 向处理程序提供回调函数的最佳做法是什么?

  3. 下面是定义处理程序的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');
            }
        };
    

2 个答案:

答案 0 :(得分:8)

您的方法遵循KO本身使用的模式,因此我认为它完全有效。当然,你也可以使用allBindingsAccessor。我解释这种方法用法的方法是

  1. 在多个绑定之间共享属性,例如,可以使用bubbleEvent绑定来指示处理不会使其冒泡的事件的任何其他绑定。
  2. 允许复杂的绑定处理程序知道其他绑定并调整其行为。
  3. 传递处理程序的最佳做法是将它们作为视图模型的命名成员,而不是内联绑定。

答案 1 :(得分:0)

要回答两个问题,使用knockoutjs和MVVM模式时强烈建议的做法是在各自的视图模型中封装与对象相关的属性和方法。

也就是说,它可以很好地拥有任何属性(参数,如果你愿意)和回调方法,它们将负责更新你的视图模型(或由于视图模型的变化而触发对其他对象的更新)视图模型本身。

然后在自定义绑定处理程序中,您可以直接从视图模型引用所需的任何属性,以及调用驻留在视图模型上的任何回调函数。

以这种方式封装成员和行为使得对每个视图模型进行单元测试非常简单。