Como adicionamos um novo recurso ao nosso aplicativo que precisava da capacidade de ocultar / mostrar uma coluna específica em uma grade GXT, um bug foi encontrado. O cabeçalho da coluna não foi alinhado com as linhas abaixo quando uma coluna foi ocultada / mostrada programaticamente. Não surpreendentemente, foi a chamada grid.reconfigure (…) que causou o bug.
Assinatura de Grid.reconfigure ():
void reconfigure(ListStore<M> store, ColumnModel cm)
Estamos usando MVP e Gin em nosso código do lado do cliente e nosso apresentador tem um método de início semelhante a este:
void start(final AcceptsOneWidget panel, final EventBus eventBus) {
//Figure out which columns to show/hide
...
display.setColumnVisibility(...);
panel.setWidget(getDisplay().asWidget());
}
Nossas instâncias de exibição são mantidas como singleton por Gin para evitar ter que recriá-las toda vez que um lugar é visitado. O bug só apareceu quando a grade já havia sido renderizada. Portanto, parece que grid.reconfigure (…) é dependente de que o widget está anexado ao DOM (GXT provavelmente faz cálculos de tamanho dependentes do DOM) ou que widget.layout () não foi executado. O método de reconfiguração não indica se é ou não o caso, mas parece-me que sim.
Então, como você evita essa situação?
Bem, ou você tem a certeza de sempre esperar (pelos ouvintes ou não) que a grade seja renderizada ou você o faz em um nível superior.
Eu resolvi isso da última maneira. No método start (…) na classe do apresentador, certifico-me de que o Display esteja anexado ao DOM antes de qualquer outra chamada que possa modificar as colunas da grade.
Depois da minha mudança, é assim que o método start () em um Presenter se parece:
public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
//Figure out which columns to show/hide
...
panel.setWidget(getDisplay().asWidget());
display.setColumnVisibility(...);
}
Para resumir, eu troquei a ordem das duas chamadas no método start na classe Presenter.