问题描述
我正在尝试在路由器不触发任何事件(如 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);
});
}
});