Qual a ordem de execução dos eventos defineGrid em uma hierarquia de classes?

Data de postagem: Feb 18, 2011 10:17:1 PM

Imaginando que temos a seguinte hierarquia de classes:

    • Avó

      • Mãe

        • Filha

E todas estas classes definem o mesmo evento:

var classKey = this.key;

this.defineGrid("test", function () {

log.write("Antes do inherited. Classe: " + classKey.nome);

inherited();

log.write("Depois do inherited. Classe: " + classKey.nome);

});

Se criarmos uma grade "test" da classe "Filha", iremos observar o seguinte log:

Antes do inherited. Classe: Filha.

Antes do inherited. Classe: Mãe.

Antes do inherited. Classe: Avó.

Depois do inherited. Classe: Avó.

Depois do inherited. Classe: Mãe.

Depois do inherited. Classe: Filha.

Ou seja, a ordem de execução é da classe informada para a grade e em seguida é executada o defineGrid existente nas classes superiores. No entanto, como cada evento costuma invocar o inherited, a ordem de execução dos códigos após o inherited é justamente o contrário. Este é o comportamento desejado, visto que a definição da classe Filha deve ser sobrepor às definições mais genéricas das classes mãe.

Uma observação importante: o defineGrid pode definir o evento onDefineFields para a grade e este evento é executado após todos os defineGrid serem executados. A ordem de execução do onDefineFields é igual a explicada para o defineGrid, no entanto devemos ter atenção que uma propriedade definida no defineGrid de Filha poderá ser sobrescrita pelo evento onDefineFields definido por Mãe. Exemplo:

Se em Filha, tivermos o x-class abaixo:

this.defineGrid("test", function () {

inherited();

this.formViewFieldNames = "CampoA";

});

E em Mãe, tivermos o x-class abaixo:

this.defineGrid("test", function () {

inherited();

this.onDefineFields(function (grid) {

grid.formViewFieldNames = "CampoB";

});

});

Teremos como resultado final o valor "CampoB" em formViewFieldNames, visto que após a execução de todos os defineGrid o valor será "CampoA", mas em seguida são executados os eventos onDefineFields que altera o valor para "CampoB";