Исключить пользовательские обработчики привязки - лучшая практика для множественных аргументов и обратных вызовов функций? - PullRequest
12 голосов
/ 07 марта 2012

Недавно я создал обработчик привязки для включения подключаемого модуля JQuery Validation в форму с использованием синтаксиса привязки данных.Я обнаружил, что мне нужно предоставить обработчику более одной информации.Мне нужно было предоставить флаг для принудительной проверки и обратный вызов для запуска после проверки.

Вопросы:

  1. Каков наилучший способ подачи нескольких аргументов?Я просто полагался на синтаксис нотации объекта, но мог также предоставить другую привязку и проверить, что привязка через параметр «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>

     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 ]

8 голосов
/ 07 марта 2012

Ваш подход здесь следует шаблону, используемому самим нокаутом, так что я думаю, что он совершенно верен.Конечно, вы также можете использовать allBindingsAccessor.Я интерпретировал использование этого метода следующим образом:

  1. Совместное использование свойств между несколькими привязками, например, привязка bubbleEvent может использоваться для указания любой другой привязки, которая имеет дело с событиями, а не для их пузыри.
  2. Чтобы обработчики сложных привязок могли знать о других привязках и корректировать их поведение.

Лучшей практикой для передачи обработчиков является использование их в качестве именованных членов в модели представления, а невстроенный в привязку.

0 голосов
/ 07 марта 2012

Чтобы ответить на оба ваших вопроса, настоятельно рекомендуется при использовании knockoutjs и шаблона MVVM инкапсулировать свойства и методы, относящиеся к вашим объектам, в их соответствующих моделях представления.

Тем не менее, он очень хорошо работает, чтобы иметь любые свойства (аргументы, если хотите) и методы обратного вызова, которые будут отвечать за обновление вашей модели представления (или запуск обновлений для других объектов из-за изменений в вашей модели представления), на которых они постоянно находятся сама модель вида.

Тогда внутри вашего собственного обработчика привязки вы можете просто ссылаться на любые нужные вам свойства непосредственно из вашей модели представления, а также вызывать любые функции обратного вызова, находящиеся в модели представления.

Инкапсуляция членов и поведения таким образом делает очень простым модульное тестирование каждой модели представления.

...