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-й повторно отправит сообщение, которое так и не было получено. Каждый знает, что другой жив, и может выполнять любые зависимые задачи.

Другие вопросы по тегам