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

问题描述

我正在尝试在路由器不触发任何事件(如 Ext.route.Router.suspend(false); this.redirectTo('...'); Ext.route.Router.resume(true); )的情况下静更改当前的 url 哈希,然后恢复路由器。我试过这个:

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); Ext.route.Router.resume(true); 之后仍然被触发。我也试过:

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

结果相同。问题似乎是事件是在当前事件循环之外触发的,所以当你挂起事件时,它们仍然在当前循环中触发。

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

> A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
   > Entry name 'classes.dex' collided``` 

解决方法

扩展您对解决方案的想法,我认为您需要添加的只是一个 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);
        });
    }
});