inkonsistent. Wir haben eine Bindung für einige typische Grid-Verwendungen in der Anwendung implementiert. Es funktioniert gut, außer, wenn Sie einen Speicher ändern, zum Beispiel einen Datensatz hinzufügen, würden Sie n + zwei identische Datensätze in Sicht sehen. Wenn ich den Zustand des Ladens untersuchte, zeigte es n + 1 Werte an.FieldBinding für Grid. Die Ansicht bleibt nach dem Hinzufügen eines neuen Datensatzes zu Store
Es geht, als ob ich ein Gitter mit einem Datensatz in gezeigt haben und rufen: grid.getStore().add(modelFactory.createModel(event.getBean()));
Ich habe jetzt:
Die zweite und die dritte Zeile gleich sind und dritte nicht sein kann ausgewählt. Auch ist es in grid.getStore()
nicht anwesend.
Quellen:
freqsGrid = new AwesomeGridPanel() {
@Override
public void createColumns() {/**/}
};
freqBinding = AwesomeGridBinding.createGridBinding(freqsGrid, "frequencies");
Einfache Bindung Quelle. Er weist die List-Eigenschaft des Modells dem Grid zu, wie es ist.
public class AwesomeGridBinding {
public static FieldBinding createGridBinding(AwesomeGridPanel grid, String property) {
return new FieldBinding(new AwesomeGridAdapterField(grid), property);
}
}
class AwesomeGridAdapterField<T> extends AdapterField {
protected AwesomeGridPanel grid;
private StoreListener<BeanModel> storeChangedListener;
public AwesomeGridAdapterField(AwesomeGridPanel grid) {
super(grid);
this.grid = grid;
configureGrid(grid, this);
}
@Override
public void setValue(Object value) {
List data;
if (value == null)
data = new ArrayList<>();
else if (!(value instanceof List))
throw new IllegalArgumentException();
else
data = (List) value;
grid.getStore().setMonitorChanges(false);
grid.getStore().setFiresEvents(false);
setResults(grid.getStore(), data);
grid.getStore().setFiresEvents(true);
grid.getStore().setMonitorChanges(true);
Wenn ich die folgende Zeile zu entfernen, hält Ansicht n + 2 Zeilen nach hinzufügen, um zu zeigen, und beginnt hinzugefügt Linie auch auf eine andere Bohne nach formBinding.bind(createModel(bean));
zu zeigen.
grid.getGrid().getView().refresh(false);
}
@Override
public Object getValue() {
List<T> result = new ArrayList<>();
for (BeanModel bm : grid.getStore().getModels())
if (isBeanForResult(bm))
result.add(extractResult(bm));
return result;
}
protected void setResults(ListStore<BeanModel> store, List data) {
store.removeAll();
for (Object obj : data)
if (obj instanceof BeanModel)
store.add((BeanModel) obj);
else
throw new IllegalArgumentException();
}
protected boolean isBeanForResult(BeanModel beanModel) {
return true;
}
protected T extractResult(BeanModel bmFromStore) {
return bmFromStore.getBean();
}
private final EventType[] STORE_EVENTS = {Store.Add, Store.Clear, Store.DataChanged, Store.Remove, Store.Update};
protected void configureGrid(final AwesomeGridPanel grid, final AdapterField field) {
grid.getStore().setMonitorChanges(true);
// grid.getStore().removeAllListeners();
if (storeChangedListener != null)
grid.getStore().removeStoreListener(storeChangedListener);
storeChangedListener = new StoreListener<BeanModel>() {
@Override
public void handleEvent(StoreEvent<BeanModel> e) {
super.handleEvent(e);
for (EventType se : STORE_EVENTS) {
if (se != e.getType())
continue;
field.fireEvent(Events.Change);
return;
}
}
};
grid.getStore().addStoreListener(storeChangedListener);
}
}
Ich habe keine Erfahrung mit gwt/gxt, also nur aus Neugier - in deiner 'setValue' Methode deaktivierst du die Änderung der Überwachung und das Auslösen von Ereignissen vor dem Aufruf von' setResult', was ist der Grund? –
@ Sva.Mu Eine weitere Option ist es, in Rekursion und Stack-Überlauf zu fallen, da setValue-Änderungen Store, es feuert Ereignisse, Ereignisse verursacht setValue. –
Es scheint mir, als würden Sie Ihre Daten ständig sauber machen, jedes Mal wenn Sie etwas hinzufügen. –