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 публикуется в модели представления компонентов "таблица данных", но пейджер не подтверждает, что событие было опубликовано.
Я обнаружил, что причина этого в том, что компонент "пейджер" должен стать активным до компонента "таблица данных", в противном случае подписка моделей представления "пейджер" проверяет только входящие публикации, когда эта строка кода была запустить.. и чаще всего это происходит после того, как таблица данных опубликовала событие.
У меня вопрос: как я могу гарантировать, что компонент пейджера станет активным до компонента таблицы данных, чтобы система событий pub-sub работала в этом режиме так, как ожидается в этом сценарии?
1 ответ
Вам нужен протокол рукопожатия. Каждый компонент опубликует started
сообщение на почтовый ящик при запуске. Каждый также подпишется на started
сообщение от другого и при его получении выдаст started
еще раз и отписаться.
В зависимости от того, что начинается первым, публикуется сообщение, которое никогда не принимается. 2-й для начала будет публиковать, 1-й получит это, повторно отправить и отписаться, а 2-й повторно отправит сообщение, которое так и не было получено. Каждый знает, что другой жив, и может выполнять любые зависимые задачи.