Если я передаю несуществующую функцию привязке event
, она завершится ошибкой только во время выполнения, а не во время привязки. Это может привести к скрытым ошибкам, если приложение не будет полностью покрыто во время тестирования. В отличие от этого, например, привязка submit
проверяет связанное значение и немедленно выдает ошибку, если это не функция.
"Тихий" сбой вызван этой строкой в привязке event
.
var handlerFunction = valueAccessor()[eventName];
if (!handlerFunction)
return;
Это намеренное поведение? Если нет, я бы хотел подготовить PR, добавив проверку к привязке event
аналогичной привязке submit
.
Я хотел бы подготовить PR, добавив проверку привязки к событию, аналогичную привязке отправки.
Было бы здорово. Спасибо.
@mbest При проверке спецификаций кажется, что это поведение действительно было намеренным, существует явный тест для передачи null
в событие mouseout
, и последняя строка соответствующего теста заявляет, что этого не должно быть. throw (при запуске события mouseout
). Вы можете вспомнить, с какой целью это было? для меня это на первый взгляд не имеет никакого смысла.
Я имею в виду именно эту строку: https://github.com/knockout/knockout/blob/master/spec/defaultBindings/eventBehaviors.js#L26
Похоже, это связано с тем, что valueAccessor
переоценивается при каждом вызове обработчика событий, поэтому я предполагаю, что это позволяет нам динамически приостанавливать обработку событий для некоторых событий. Но вариант использования для этого на первый взгляд неясен, и я даже не могу найти никаких заметок об этом в документации.
поэтому я предполагаю, что это позволяет нам динамически приостанавливать обработку событий для некоторых событий
Хм. Вы можете быть правы. Я помню, как это применялось раньше как метод приостановки событий.
Я отследил изменение до # 73, так что это было некоторое время (до того, как я был задействован).
Поразмыслив, я все еще думаю, что проблема заключается в том, что нокаут не вызывает ошибку привязки, когда я передаю функцию, в которой, например, я допустил опечатку.
Вероятно, мы должны ввести проверку перед подключением обработчиков событий и разрешить явные значения null
, но не что-либо еще.
Самый полезный комментарий
Поразмыслив, я все еще думаю, что проблема заключается в том, что нокаут не вызывает ошибку привязки, когда я передаю функцию, в которой, например, я допустил опечатку.
Вероятно, мы должны ввести проверку перед подключением обработчиков событий и разрешить явные значения
null
, но не что-либо еще.