DataSource işlemini dinleyin ve SmartGWT'de dinleyicilere haber verin

Bir DataSource alanının başka bir DataSource değerine bağlı olduğunu düşünün. Bu DataSource'u kullanan her bir ListGrid, herhangi bir değişiklikten otomatik olarak nasıl haberdar edilir? Mümkünse , tüm ListGrid'ini yeniden çizmek zorunda kalmadan, yalnızca etkilenen kayıtları mı?

Gözlemci olarak aşağıdaki sınıfı göz önünde bulundurun:

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.
    }

}

Ve gözlemlenebilir Veri Kaynağımız:

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 cevap

Bazı arama yaptıktan ve denedikten sonra, DataSource'un her kullanıcısını kolayca bilgilendiremeyeceğinizi öğrendim. processResponse çağrıldığında, her bir ayrı dinleyicide bir fireCallback veri kaynağı aranır. Ne yazık ki, işlevselliği yeniden oluşturamadım, ancak neyse ki durum için bir çözüm buldum:

Her bir dinleyicinin önbelleğini el ile geçersiz hale getirmeniz gerekir. ListGrid için bu invalidateCache ile ve invalidateDisplayValueCache ile ComboBoxItem ile yapılabilir. Örneğin.:

public class ObserverDataSource extends DataSource {

    private Set handlers = new HashSet();

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

}

Diğer olası çözümler, tüm ListGrid 'ini yeniden çizmek olabilir, ancak bu daha etkilidir.

0
katma