如何在不触发 ExtJS7 中的任何事件的情况下暂停和恢复路由器?

How to suspend and resume Router without firing any events in ExtJS7?

我正在尝试在路由器不触发任何事件(如 onStateChange)的情况下静默更改当前 url 哈希,然后恢复路由器。我试过这个:

Ext.route.Router.suspend(false);
this.redirectTo('...');
Ext.route.Router.resume(true);

但是 onStateChangeresume() 之后仍然被触发。我也试过:

Ext.route.Router.suspend(false);
Ext.util.History.un('change', Ext.route.Router.onStateChange, Ext.route.Router);
Ext.util.History.suspendEvents(false);

this.redirectTo('...');

Ext.util.History.resumeEvents(true);
Ext.util.History.on('change', Ext.route.Router.onStateChange, Ext.route.Router);
Ext.route.Router.resume(true);

同样的结果。问题似乎是事件是在当前事件循环之外触发的,所以当您暂停事件时,它们仍在当前循环中触发。

我最终使用了这个似乎可以解决问题的 hack,但也许有更简洁的解决方案:

Ext.route.Router.suspend(false);
this.redirectTo('...');
Ext.Function.defer(function(){
    Ext.route.Router.resume(true);
}, 1, this);

扩展您对解决方案的想法,我认为您需要添加的只是一个 clearLastTokens 调用。这是一个测试 Fiddle,以及我要应用的覆盖。

Ext.define('RouteOverride', {
    override: 'Ext.route.Mixin',

    redirectToSilent: function (hash, opt) {
        const Router = Ext.route.Router;
        const currentRoute = Ext.util.History.getToken();
        Router.suspend(false);
        this.redirectTo(hash, opt);
        Ext.asap(function () {
            Router.clearLastTokens(currentRoute);
            Router.resume(true);
        });
    }
});