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

dro*_*gon 12 jquery-validate knockout.js

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

问题:

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

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

下面是定义处理程序的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>
Run Code Online (Sandbox Code Playgroud)
     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');
        }
    };
Run Code Online (Sandbox Code Playgroud)

mad*_*kay 8

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

  1. 在多个绑定之间共享属性,例如,可以使用bubbleEvent绑定来指示处理不使其冒泡的事件的任何其他绑定.
  2. 允许复杂的绑定处理程序知道其他绑定并调整其行为.

传递处理程序的最佳做法是将它们作为视图模型上的命名成员,而不是内联绑定.


Kod*_*hor 0

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

也就是说,将负责更新视图模型(或由于视图模型的更改而触发对其他对象的更新)的任何属性(如果愿意的话)和回调方法驻留在视图模型上,效果非常好本身。

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

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