Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ExtJS7中暂停和恢复路由器而不触发任何事件?_Extjs_Extjs7 - Fatal编程技术网

如何在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感谢你的帮助,这似乎是你想要的,肯定比依赖全局变量要好。你想把它作为一个答案,我会接受它。