2017-07-28 7 views
0

コンポーネント内のノックアウト観測で公開している問題があり、このポストボックスイベントにサブスクライブするビューモデルを持つ別のコンポーネントがあります。コンポーネント間のノックアウトポストボックス - サブスクライバがアクティブであることを確認する方法

公開イベントは、私の「データ・テーブル」コンポーネント内でモデルを表示し、以下のとおりである。

this.pagerParams = ko.observable({ currentPage: this.currentPage, totalItems: this.recordsTotal, itemsPerPage: this.length }).publishOn("pagerParams"); 

私はその後、公開この郵便ポストに加入している「ポケットベル」コンポーネントを持っています。

ko.postbox.subscribe("pagerParams", (params: PagerParams) => { 
      this.assignParamValues(params, false); 

      this.numberOfPages(Math.ceil(this.totalItems()/this.itemsPerPage()) || 1); 
      this.pageNumbers(this.getPageNumbers()); 
     }); 

上記のpostboxサブスクリプションは、ビューモデルコンストラクタに登録されています。どのコンポーネントが最初にアクティブになるかによって、pagerParamsサブスクリプションが 'データテーブル'コンポーネントビューモデルで公開されることがありますが、ポケットベルはイベントが公開されたことを認識しません。

これは、 'pager'コンポーネントが 'data-table'コンポーネントの前でアクティブになっている必要があるためです。そうでなければ、 'pager'ビューモデルのサブスクリプションは、のコードが実行されている..多くの時間、これは、データテーブルがイベントを公開した後です。

私の質問は、pub-subイベントシステムがこのシナリオで期待どおりに動作するように、データテーブルコンポーネントの前でページャコンポーネントがアクティブになることをどうすればいいですか?

答えて

1

ハンドシェイクプロトコルが必要です。各コンポーネントは、起動時にポストボックスにstartedというメッセージを発行します。どちらも、もう一方からのstartedメッセージを購読し、受け取ったらstartedを再度発行して購読を停止します。

最初に開始されるのは、決して受信されないメッセージです。 2回目は公開し、1回目はそれを受信し、再送信し、解除し、2回目は受信しなかったメッセージを再送信します。それぞれは、もう一方が生きていることを知っていて、それに従属する仕事をすべて行うことができます。

関連する問題