Событие изменения смены при обновлении свойства модели нокаута

Здесь 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, поэтому вам понадобится консоль для просмотра полезной информации.