Подтвердить что ты не робот

Обработчики пользовательских привязок Knockout - многократные аргументы и функция callbacks наилучшей практики?

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

Вопросы:

  • Какова наилучшая практика для подачи нескольких аргументов? Я просто полагался на синтаксис нотации объектов, но мог также предоставить другое связывание и проверить, что привязка через параметр "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');
        }
    };
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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