Прослушайте работу источника данных и уведомите слушателей в SmartGWT - PullRequest
2 голосов
/ 28 октября 2011

Представьте, что поле источника данных зависит от значений другого источника данных.Как каждый ListGrid, который использует этот DataSource, будет автоматически уведомлен о любых изменениях? Если возможно , без необходимости перерисовывать весь ListGrid, но только для затронутых записей?

Рассмотреть следующий класс как наблюдатель :

public class ObserverDataSource extends DataSource {

    public ObserverDataSource() {
    // This field needs to update/notify every ListGrid that uses 
    // this DataSource when a change occurs in the CountryDataSource.
        DataSourceField countryField = new DataSourceTextField("country", "Country");
        addField(countryField);
        // Other fields...
    }

    public void update() {
    // invalidateCache() doesn't work on its own.
    // What will make each object (ListGrid) that uses the DataSource refresh itself?
    // Even better if it only refreshes the changed records.
    // E.g. now a full redraw of the ListGrid.
    }

}

И наш наблюдаемый Источник данных:

public class ObservableDataSource extends DataSource {

    public ObservableDataSource() { 
    DataSourceField idField = new DataSourceIntegerField("id", "Id");
    idField.setPrimaryKey(true);       
    DataSourceField countryField = new DataSourceTextField("country", "Country");
    DataSourceField codeField = new DataSourceIntegerField("code", "Country code");
    setFields(idField, countryField, codeField);
    }

    public executeFetch(...) {
    // Doesn't change anything, don't notify observers.
    // Do logic...
    processResponse(requestId, response);
    }

    public executeAdd(...) {
    // Changed the data, notify the observer (MyDataSource instance).
    // Do logic...
    myDataSourceInstance.update();
    processResponse(requestId, response);
    }

}

Примечание: шаблон источника данных основан на GwtRpcDataSource, который можно найти здесь .1019 *

1 Ответ

0 голосов
/ 14 ноября 2011

После некоторых поисков и экспериментов я обнаружил, что вы не можете так легко уведомить каждого пользователя источника данных. Источник данных вызывает fireCallback для каждого отдельного слушателя, когда вызывается processResponse. Увы, я не смог воссоздать функциональность, но, к счастью, я нашел обходной путь для ситуации:

Вам необходимо отключить кэш каждого слушателя вручную. Для ListGrid это может быть сделано с invalidateCache, но ComboBoxItem с invalidateDisplayValueCache. E.g.:

public class ObserverDataSource extends DataSource {

    private Set<MyChangeHandler> handlers = new HashSet<MyChangeHandler>();

    public void update() {
        for(MyChangeHandler handler : handlers){
            handler.onChanged(/* Calls invalidateCache on itself */);
        }
    }

}

Другими возможными решениями могут быть перерисовка всего ListGrid, но это более эффективно.

...