2017-07-28 30 views
0

我有一個問題,我在一個組件中發佈了knockout observable,並且有一個訂閱了這個postbox事件的視圖模型的另一個組件。Knockout Postbox組件之間進行通信 - 如何確保訂閱者處於活動狀態

的發佈事件是內我的「數據表」分量查看模型和如下:

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()); 
     }); 

上述郵箱訂閱已在視圖模型構造函數中註冊。根據哪個組件首先變爲活動,我有時會遇到一個問題,即pagerParams訂閱在「數據表」組件視圖模型中發佈,但是尋呼機不承認該事件已發佈。

我發現原因是因爲'pager'組件需要在'data-table'組件之前變爲活動的,否則'pager'視圖模型訂閱只會在該行時檢查任何傳入發佈的代碼已經運行..很多時候,這是在數據表發佈事件之後。

我的問題是,如何確保頁面組件在數據表組件之前變爲活動狀態,以便pub-sub事件系統按照預期在此場景中工作?

回答

1

您需要一個握手協議。每個組件在啓動時都會在郵箱上發佈started消息。每個人也將訂閱started消息,並在收到消息後再次發出started並取消訂閱。

無論先發生什麼,都會發布一條永遠不會收到的消息。第二個開始發佈,第一個將接收,重新發送和取消訂閱,第二個將重新發送一個從未收到的消息。每個人都知道對方還活着,然後可以執行任何相關任務。

相關問題