Bug Ext JS 4.1: suspendEvents não Afeta Ext.app.Controller.control - MVC

25 Apr 2012
1 min read

Como vocês sabem, estou postando os exemplos da Sencha no formato MVC aqui no blog. Essa semana, quando estava migrando um exemplo para MVC, me deparei com um bug do ExtJS.

Quando (por algum motivo) é necessário chamar o método suspendEvents de alguma classe, e essa mesma classe (geralmente um componente UI) tem um listener no control da classe controller de uma aplicação MVC, esse método não funciona e continua disparando os eventos.

Depois de muita dor de cabeça e muito debug, resolvi procurar no fórum da Sencha sobre esse problema. E não é que tem um bug aberto sobre isso lá? Sorte que nessa thread tem também uma solução temporária enquanto o pessoal da Sencha não acerta isso.

Bem, se você está passando por esse mesmo problema, e a versão que você está usando é a ExtJS 4.1  ou inferior, ou se o bug ainda estiver marcado como OPEN no fórum, adicione esse overrride no seu código que tudo volta a funcionar normalmente:

[code lang="js" firstline="1" toolbar="true" collapse="false" wraplines="false"]
/*
* BUG: suspentEvents not honoured in Ext.app.EventBus
*
* note: this fix does not queue events when asked.
*
* http://www.sencha.com/forum/showthread.php?171525
*/
Ext.syncRequire('Ext.app.EventBus');
Ext.override(Ext.app.EventBus, {
constructor: function() {
this.mixins.observable.constructor.call(this);

this.bus = {};

var me = this;
Ext.override(Ext.Component, {
fireEvent: function(ev) {
// [
// --
// if (Ext.util.Observable.prototype.fireEvent.apply(this, arguments) !== false) {
// ++
if (Ext.util.Observable.prototype.fireEvent.apply(this, arguments) !== false && !this.eventsSuspended) {
// ]
return me.dispatch.call(me, ev, this, arguments);
}
return false;
}
});
}
});
[/code]

Esse bug está aberto desde janeiro de 2012 e fiquei um pouco chateada por ele estar aberto até abril (mês que escrevi esse post). O MVC está sendo adotado pelo pessoal que começou a migrar e eu já estou ficando viciada em escrever apenas em MVC e não mais do modo estruturado como fazia com o ExtJS 3. E um bug desses realmente atrapalha (além dos outros existentes relacionados a MVC) e pode fazer com que algumas pessoas demorem mais para adotar a nova arquitetura, já que ela foi criada para ser usada como padrão de desenvolvimento em ExtJS.

Bons códigos!