9

ko コンポーネントを使用して変換したい Web アプリと SPA があります。ある種のコンポーネント間通信をどのように行うのだろうか。

たとえば、すべてのコンポーネントが通知を送信できる「通知」コンポーネントが必要です。

メイン ビュー モデルで監視可能な配列を共有することで、解決策を見つけることができました。

var VM = function() {
    var self = this;

    this._notifications = ko.observableArray([]);
   this.notifications = {
        addInfo: function(text){
            self._notifications.push(text);
        }
    }
}

<comp1 params="{app: $data}"></comp1><br/>
<comp2 params="{app: $data}"></comp2><br/>
<notif params="{app: $data}"></notif>

ここを参照してください: http://jsfiddle.net/nveron/j4829y7p/

私はこのソリューションに完全に満足しているわけではありません。通知データを通知コンポーネントに保持したかったのです。

それに対処するアイデアはありますか?

4

1 に答える 1

16

ko.subscribableシンプルな pub/sub メッセージ バスを実装するために使用できます。

  • ko.subscribable.subscribe新しいメッセージを購読するには
  • ko.subscribable.notifySubscribers新しいメッセージを公開する

    詳細については、Ryan Niemeyer によるこの記事を参照してください。

あなたの場合、にpostbox基づいてグローバルオブジェクトを作成できますko.subscribable。コンポーネントはメッセージを発行し、通知 vm はそれにサブスクライブします。

トピックごとにメッセージを発行および購読することもできます。

Demo: JSFiddle

ポストボックス:

var postbox = (function() {
    var pb = new ko.subscribable();
    return {    
        subscribe: function(handler, topic) {
            pb.subscribe(handler, null, topic)
        },        
        publish: function(message, topic) {
            pb.notifySubscribers(message, topic);
        }
    };
}()); 

コンポーネント:

var comp1 = function(params) {           
    this.addToNotif = function(){
        postbox.publish("comp1 was here");
    }
}

通知:

...
postbox.subscribe(function(message) {
    self.notifs.push(message);
});
于 2014-10-08T09:40:09.393 に答える