"is there any way to get knockout to somehow become callback aware?"
はい、サブスクリプションを使用できます。すべての observables、observableArrays、computeds は subscribable 型から継承されるため、これを行うことができます。
var foo = ko.observable("foo");
foo.subscribe(function (newValue) {
// When foo updates, this function is called
});
サブスクリプションを使用すると、一時的なサブスクリプションを設定して、不要になった場合に後でキャンセルすることもできます。
var fooSub = foo.subscribe(function (newValue) {
// When foo updates, this function is called
});
// Somewhere else in the app...
fooSub.dispose();
デフォルトでは、サブスクリプションは「変更」というトピックにサブスクライブします。つまり、オブザーバブルの値が変更されると、newValue (パラメーターの名前) を使用してすべてのサブスクライバーが呼び出されますが、値の前にロジックを実行するために、トピック「beforeChange」にサブスクライブするサブスクリプションを設定することもできます。変化します。
foo.subscribe(function (oldValue) {
// Do logic on the oldValue here
}, null, 'beforeChange');
これについては、ノックアウトのドキュメントで読むことができます。ただし、必要に応じてカスタム トピックを購読することもできます。デフォルトでは、オブザーバブルの値が変更されると、「beforeChange」トピックと「change」トピックが値の変更の前後に (それぞれ) 発生します。ただし、後で手動でトリガーできるカスタム トピックをサブスクライブして、そのトピックをリッスンしているサブスクライバーに通知することができます。
foo.subscribe(function (value) {
// Do logic when observable notifies subscribers to the 'customTopic' topic
}, null, 'customTopic');
// Somewhere else in the app...
var value = "bar";
foo(value);
foo.notifySubscribers(value, 'customTopic');
このようにして、相互に直接参照していない個別のビュー モデル間の通信をセットアップできます。これは、これを行う方法についての私の大雑把な理解です。詳細については、Ryan Niemeyer のヒントとコツのビデオをご覧ください。具体的には、サブスクリプション セクションです。
このようにして、ノックアウトで一種のコールバックを実行できます。これらのトピックの subscribeTo と publishOn にオブザーバブルを拡張する Ryan のKnockout-postboxライブラリもチェックしてください。
$.ajax リクエストが使用する基礎となる部分であるjQuery $.Deferredsを調べることもできます。これはノックアウト コールバックではありませんが、一種のコールバックです。
それがあなたが探しているもの以上のものであるかどうか教えてください。