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";