Обработчики пользовательских привязок 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');
}
};
Ответы
Ответ 1
Ваш подход здесь следует за шаблоном, используемым самим KO, поэтому я считаю, что это совершенно верно. Вы также можете использовать allBindingsAccessor. То, как я интерпретировал использование этого метода, - это
- Совместное использование свойств между несколькими связями, например привязка bubbleEvent, может использоваться для указания на любое другое связывание, которое имеет дело с событиями, чтобы не пузырить их.
- Чтобы позволить сложным обработчикам привязки быть в курсе других привязок и корректировать их поведение.
Лучшая практика для передачи обработчиков состоит в том, чтобы иметь их как именованные элементы в вашей модели представления, а не встроенные в привязку.
Ответ 2
Чтобы ответить на оба ваших вопроса, настоятельно рекомендуется использовать методы knockoutjs и MVVM для инкапсуляции свойств и методов, относящихся к вашим объектам в их соответствующих моделях просмотра.
Тем не менее, он отлично работает, чтобы иметь какие-либо свойства (аргументы, если вы это сделаете) и методы обратного вызова, которые будут отвечать за обновление модели вашего представления (или запуск обновлений для других объектов из-за изменений в вашей модели представлений) самой модели представления.
Затем внутри вашего настраиваемого обработчика привязки вы можете просто ссылаться на любые свойства, которые вам нужны непосредственно из вашей модели просмотра, а также вызывать любые функции обратного вызова, находящиеся в модели представления.
Инкапсуляция членов и поведение таким образом делает его очень простым для unit test каждой модели представления.