如何在ExtJS7中暂停和恢复路由器而不触发任何事件?
我试图在路由器不触发任何事件(如如何在ExtJS7中暂停和恢复路由器而不触发任何事件?,extjs,extjs7,Extjs,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'
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);
扩展您的解决方案想法,我认为您只需要添加一个clearLastTokens
调用。这是一个测试,以及我将应用的覆盖
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);
});
}
});
我有一个与你的黑客非常相似的解决方案,所以你并不孤单。我认为,由于路由是多么复杂(基于承诺),您不能像您指出的那样在同一事件循环中简单地挂起/恢复。我唯一建议的是创建一个通用的Ext.route.Router
方法来封装上面的逻辑。@incutonez谢谢,经过更多的测试,我发现这个方法不是很好,它与浏览器的“后退”按钮不兼容:返回到默认设置的url后,它不会触发状态更改。因此,我能想到的唯一解决办法是使用一个全局变量“ignoreroute changes”,我在我的beforeRoute
处理程序中检查它,并忽略进一步的路由处理。它还必须依赖定时延迟函数来重新启用此标志,这非常混乱。因此,在执行resume
调用之前,我有Ext.route.Router.clearLastTokens(currentRoute)代码>在任何黑客攻击完成之前,从Ext.util.History.getToken()中提取currentRoute。我遇到了同样的问题,这就是我想出的解决办法。这肯定有点混乱,如果你有帐户,可能需要创建一个Sencha支持线程。@incutonez感谢你的帮助,这似乎是你想要的,肯定比依赖全局变量要好。你想把它作为一个答案,我会接受它。