Событие изменения смены при обновлении свойства модели нокаута
Здесь jsfiddle, чтобы показать, в чем проблема:
http://jsfiddle.net/boblauer/BgvV4/
Я пытаюсь запустить событие изменения после обновления текстового поля. К сожалению, внутри метода подписки значение текстового поля еще не обновлено, поэтому, когда я рисую событие изменения, он выстрелил слишком рано.
Мне нужно запустить событие изменения, потому что у меня есть сторонний код, который находится вне моего контроля, который полагается на событие изменения.
Любые предложения?
Ответы
Ответ 1
Простым решением является перенос вашего вызова в $( "# text1" ). change() в setTimeout с таймаутом 0. Это достаточно, чтобы позволить нокауту выполнять (синхронное) обновление до текстового поля перед jquery вызывается обработчик изменений.
Я развернул вашу скрипку, чтобы продемонстрировать:
http://jsfiddle.net/SuRYa/1//
Если это то, что вам нужно сделать много, лучшее решение, вероятно, для того, чтобы обернуть это поведение в пользовательскую привязку, где обратный вызов "обновления" привязки будет активировать событие изменения jquery на обновленном элементе.
Ответ 2
bmode является правильным, пользовательская привязка сделает это. Хотя этот ответ немного запоздалый, вот привязка в случае, если он помогает кому-то впоследствии читать этот пост. Он обновляет значение текстового поля с помощью jQuery - теперь DOM обновляется, чтобы работать с сторонним кодом Bob, поэтому он запускает событие изменения.
ko.bindingHandlers.valueAndFireChange = {
update: function(element, valueAccessor) {
var val = ko.unwrap(valueAccessor());
if (val == undefined) return;
$(element).val(val);
$(element).change();
}
};
Здесь обновленная версия скрипта Боба показывает это в действии:
http://jsfiddle.net/BgvV4/17/
Я изменил оповещения на console.log, поэтому вам понадобится консоль для просмотра полезной информации.