Слухайце аперацыі DataSource і паведаміць слухачоў у SmartGWT

Уявіце сабе, што поле DataSource залежыць ад значэнняў іншай крыніцы дадзеных. Як бы кожны ListGrid, які выкарыстоўвае гэты крыніца дадзеных будзе аўтаматычна атрымліваць апавяшчэнні аб любых зменах? Калі магчыма , без неабходнасці перамалёваць ўвесь 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.
    }

}

І наш <моцны> назіраным DataSource:

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);
    }

}

Note: the DataSource template is based on GwtRpcDataSource, which can be found here.

2

1 адказы

Пасля некаторага пошуку і эксперыментавання, я даведаўся, што вы не можаце паведаміць кожнага карыстальніка аб DataSource, які лёгка. Крыніца дадзеных выклікаў fireCallback на кожным асобным слухача, калі processResponse быў названы. Нажаль, я не мог узнавіць функцыянальнасць, але, на шчасце, я знайшоў абыходны шлях для сітуацыі:

Вы павінны ануляваць кэш кожнага слухача ўручную. Для ListGrid гэта можна зрабіць з дапамогай invalidateCache і, але ComboBoxItem з invalidateDisplayValueCache . г.д.:

public class ObserverDataSource extends DataSource {

    private Set handlers = new HashSet();

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

}

Іншыя магчымыя рашэнні могуць быць перамалёваць ўвесь ListGrid , але гэта больш эфектыўная.

0
дададзена