1

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

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

但是onStateChange之后还是被解雇了resume()。我也试过:

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);

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

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

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

1 回答 1

1

扩展您对解决方案的想法,我认为您需要添加的只是一个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);
        });
    }
});
于 2021-04-23T02:48:26.283 回答