Я неправильно строю обработчики привязки?
Во всех моих пользовательских обработчиках привязки я всегда опускаю обратный вызов обновления. Я рассуждаю о том, что могу выполнить всю работу, которая мне нужна, в обратном вызове init. Там я могу создавать компьютерные вычисления, вызывать applyBindingsToNode (если мне нужно) или настраивать подписки на подписки вручную и выполнять манипуляции с DOM внутри этих подписок.
Меня беспокоит то, что привязки по умолчанию в нокауте создаются только с помощью обратного вызова обновления.(Обновление: больше нет, значение и некоторые другие привязки теперь используют только init) Есть ли какой-либо недостаток в выполнении всей работы внутри обратного вызова init? Я что-то пропустил? Спасибо!
2 ответа
Создание вычислений и подписок в init
Функция, как вы делаете, полностью поддерживается в Knockout начиная с версии 3.0. Это более продвинутый метод, чем использование update
поскольку это означает, что вам нужно больше заботиться о том, чтобы обеспечить захват и реагирование на все зависимости, а также распоряжение подписками в нужное время.
Для справки, update
Сама функция обрабатывается в Knockout довольно просто (немного изменена для ясности):
var handlerUpdateFn = handler.update;
if (typeof handlerUpdateFn == "function") {
ko.computed(
function () {
handlerUpdateFn(node, getValueAccessor(bindingKey), allBindings,
bindingContext.$data, bindingContext);
},
null,
{ disposeWhenNodeIsRemoved: node }
);
}
Вы заменяете механизм обновления обработчика привязки вычисляемыми и подписками, так что да, это явно не лучшая практика при создании пользовательских обработчиков привязки, иначе не было бы функции обновления.
Помимо нарушения передового опыта, вы просто создаете дополнительные издержки с добавлением подписок и вычислений, которые не нужны. Для вас будет выполнен поток привязки. Knockout уже оценивает выражение, отправленное в обработчик привязки, и выполняет функцию обновления для вас. Таким образом, вы в дополнение к этому добавляете вычисления и подписки, которые вполне могут вызвать неожиданное поведение. Могут быть случаи, когда это может быть необходимо до некоторой степени, но если вообще не использовать встроенный механизм обновления, это может привести только к проблемам и путанице.