组件之间通信的 Knockout 邮箱 - 如何确保订阅者处于活动状态

Knockout Postbox communicating between components - how to ensure subscriber is active

我有一个问题,我在一个组件内发布一个可观察到的淘汰赛,并且有另一个组件具有订阅此邮箱事件的视图模型。

发布事件在我的 'data-table' 组件视图模型中,如下所示:

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

然后我有一个订阅此邮箱发布的 'pager' 组件。

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

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

上述邮箱订阅已在视图模型构造函数中注册。根据哪个组件首先激活,我有时会遇到一个问题,即 pagerParams 订阅已在 'data-table' 组件视图模型中发布,但寻呼机不承认该事件已发布。

我发现这是因为 'pager' 组件需要在 'data-table' 组件之前激活,否则 'pager' 视图模型订阅只检查任何incoming 在该行代码为 运行.. 时发布,而且很多时候,这是在 data-table 发布事件之后。

我的问题是,如何确保寻呼机组件在数据-table 组件之前激活,以便发布-订阅事件系统在这种情况下按预期工作?

你需要一个握手协议。每个组件在启动时都会在邮箱中发布一条started消息。每个人也会订阅对方的 started 消息,收到消息后,将再次发出 started 并取消订阅。

谁先开始,谁就会发布一条永远不会收到的消息。第二个开始将发布,第一个将接收、重新发送和取消订阅,第二个将重新发送从未收到的消息。每个人都知道对方还活着,然后可以做任何相关的任务。