如何在不触发 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);
但是 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);
同样的结果。问题似乎是事件是在当前事件循环之外触发的,所以当您暂停事件时,它们仍在当前循环中触发。
我最终使用了这个似乎可以解决问题的 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);
});
}
});
我正在尝试在路由器不触发任何事件(如 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);
同样的结果。问题似乎是事件是在当前事件循环之外触发的,所以当您暂停事件时,它们仍在当前循环中触发。
我最终使用了这个似乎可以解决问题的 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);
});
}
});