0

このガイドに従う: http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html

Durandal アプリケーションに pub/sub 機能を実装しようとしました。durandal アプリの構造により、"home.js" などの他のビューモデルを使用する shell.js モデルが得られます。

shell.js には、次のコードがあります。

var postbox = new ko.subscribable();

ko.subscribable.fn.publishOn = function (topic) {
    this.subscribe(function (newValue) {
        postbox.notifySubscribers(newValue, topic);
    });

    return this; //support chaining
};

ko.subscribable.fn.subscribeTo = function (topic) {
    postbox.subscribe(this, null, topic);
    return this;  //support chaining
};

this.myObservable = ko.observable().subscribeTo("myTopic");

次に、「home.js」には次のものがあります。

this.myObservable = ko.observable("myValue").publishOn("myTopic");

ただし、shell.js では myObservable は常に「未定義」です。

プロジェクトの関連部分のみを jsFiddle に投稿する方法がわからなかったので、ここで最小限の例を作成して問題を示しました。

http://jsfiddle.net/PTSkR/75/

ここでは、公開名と非公開名の両方が表示されているはずですが、非公開名しか表示されていません。ここで「.subscribeTo」が機能しないのはなぜですか? 私はクロムを使用しており、キャッシュをクリアしました。

更新:「subscribeTo()」の値は、「publishOn()」の値が変更されたときにのみ値をキャプチャし、ロード時に値をキャプチャしないためだと思います。この変更を参照してください。

http://jsfiddle.net/PTSkR/76/

これが起こらないように、「subscribeTo()」値にトピックの初期値を取得させる方法はありますか?

4

1 に答える 1

0

フィドルにfirebug liteを追加し、ビューモデルインスタンスを変数に保存して、firebugでアクセスできるようにしました:http://jsfiddle.net/Gt5pp/

vm.privateName("test 2")updateを実行するprivateNameと、PUBLIC と PRIVATE の両方が更新されるため、正常に動作しtest 2ているように見えます。

PUBLIC が開始されない理由についてtestは、オブザーバブルが作成され、その値がpublishOn登録される前に設定されているため、最初の値セットが「聞こえない」ためだと思います。

于 2013-05-26T00:16:28.213 に答える