1

ここで属性バインディング ( attr) を使用する必要があるシナリオがありますが、適用する実際の値はコールバック経由で返されます。

答えはノーだと思います。非同期ノックアウトプラグインの1つを使用する必要がありますが、それらのいくつかはdirtyflagsなどの設定が必要なので、モデルを複雑にしたくありません。

コード例を次に示します。

function SomeViewModel()
{
    var someStorageMechanism = new StorageMechanism();

    this.GetUserPicture = function(userId) {
        someStorageMechanism.GetUserData(userId, function(userData) {
            // should really be using a callback argument then do callback(userData.picture); but knockout has no notion of this
        });
    };
}

<img data-bind="attr: { src: GetUserPicture($data.userId) }"/>

上記の例では、GetUserPicture理想的には画像データ文字列または URL を返す必要がありますが、この場合、非同期で動作する基になるオブジェクトからデータを取得する必要があるため、この問題を解決する簡単な方法はありますか?

4

1 に答える 1

2

"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を調べることもできます。これはノックアウト コールバックではありませんが、一種のコールバックです。

それがあなたが探しているもの以上のものであるかどうか教えてください。

于 2013-09-05T19:32:45.160 に答える