2017-07-28 3 views
0

Ich habe ein Problem, wo ich auf einer Knockout-Observable innerhalb einer Komponente veröffentlichen, und eine andere Komponente mit einem Ansichtsmodell, das dieses Postbox-Ereignis abonniert hat.Knockout Postbox Kommunikation zwischen Komponenten - wie sicherzustellen, Abonnenten ist aktiv

Die Veranstaltung veröffentlichen hab ich in meinem ‚Daten-Tabelle‘ Komponenten-Modell anzeigen und ist wie folgt:

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

Ich habe dann einen ‚Pager‘ Komponente, die veröffentlichen zu diesem Postbox abonniert.

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

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

Das obige Postbox-Abonnement ist im Ansichtsmodellkonstruktor registriert. Abhängig davon, welche Komponente zuerst aktiv wird, erhalte ich manchmal ein Problem, bei dem das Abonnement von pagerParams im Komponentenansichtsmodell "Datentabelle" veröffentlicht wird, aber der Pager erkennt nicht an, dass das Ereignis überhaupt veröffentlicht wurde.

Ich habe herausgefunden, dass der Grund dafür ist, dass die Komponente 'Pager' vor der Komponente 'datentable' aktiv werden muss, andernfalls prüft die Subskription 'pager' view models nur nach eingehenden Veröffentlichungen, wenn diese Zeile angezeigt wird Code wurde ausgeführt .. und die meiste Zeit, nachdem die Datentabelle das Ereignis veröffentlicht hat.

Meine Frage ist, wie kann ich sicherstellen, dass die Pager-Komponente vor der Datentabelle Komponente aktiv wird, so dass das Pub-Sub-Ereignissystem in diesem wie erwartet in diesem Szenario funktioniert?

Antwort

1

Sie benötigen ein Handshake-Protokoll. Jede Komponente veröffentlicht beim Start eine started Nachricht in der Postbox. Jeder wird auch die started Nachricht von der anderen abonnieren und beim Empfang wird started erneut ausgeben und abbestellen.

Welcher zuerst startet, wird eine Nachricht veröffentlichen, die nie empfangen wird. Der 2. Start wird veröffentlicht, der 1. wird das empfangen, erneut senden und abmelden, und der 2. wird eine Nachricht erneut senden, die niemals empfangen wird. Jeder weiß, dass der andere lebt, und kann dann abhängige Aufgaben erledigen.

Verwandte Themen