問題が何であるかを示すjsfiddleは次のとおりです。
http://jsfiddle.net/boblauer/BgvV4/
テキスト フィールドが更新された後に変更イベントを発生させようとしています。残念ながら、サブスクライブ メソッド内では、テキスト ボックスの値はまだ更新されていないため、change イベントが発生するのが早すぎます。
変更イベントに依存する制御できないサード パーティ コードがあるため、変更イベントを発生させる必要があります。
助言がありますか?
問題が何であるかを示すjsfiddleは次のとおりです。
http://jsfiddle.net/boblauer/BgvV4/
テキスト フィールドが更新された後に変更イベントを発生させようとしています。残念ながら、サブスクライブ メソッド内では、テキスト ボックスの値はまだ更新されていないため、change イベントが発生するのが早すぎます。
変更イベントに依存する制御できないサード パーティ コードがあるため、変更イベントを発生させる必要があります。
助言がありますか?
簡単な解決策は、$("#text1").change() への呼び出しをタイムアウト 0 の setTimeout でラップすることです。jquery 変更ハンドラーが取得する前に、ノックアウトがテキスト ボックス値に対して (同期) 更新を行うにはこれで十分です。呼び出されました。
私はデモンストレーションのためにあなたのフィドルをフォークしました: http://jsfiddle.net/SuRYa/1//
これが多くのことを行う必要がある場合、おそらくより良い解決策は、バインディングの「更新」コールバックが更新された要素で jquery 変更イベントを発生させるカスタム バインディングでこの動作をラップすることです。
bmode は正しく、カスタム バインディングがそれを行います。この回答は少し遅れていますが、後でこの投稿を読む人に役立つ場合に備えて、バインディングを次に示します。jQuery を使用してテキストボックスの値を更新します。ボブのサードパーティ コードが機能するように DOM が更新され、change イベントが発生します。
ko.bindingHandlers.valueAndFireChange = {
update: function(element, valueAccessor) {
var val = ko.unwrap(valueAccessor());
if (val == undefined) return;
$(element).val(val);
$(element).change();
}
};
これが実際に動作していることを示すボブのフィドルの更新版です。
アラートを console.log に変更したので、役立つ情報を表示するにはコンソールを開く必要があります。