在SmartGWT中侦听数据源操作并通知侦听器

在SmartGWT中侦听数据源操作并通知侦听器,gwt,smartgwt,Gwt,Smartgwt,假设一个数据源字段依赖于另一个数据源的值。如何将任何更改自动通知使用该数据源的每个ListGrid?如果可能,无需重新绘制整个ListGrid,而只需重新绘制受影响的记录 将以下类视为观察者: public class ObserverDataSource extends DataSource { public ObserverDataSource() { // This field needs to update/notify every ListGrid that uses

假设一个数据源字段依赖于另一个数据源的值。如何将任何更改自动通知使用该数据源的每个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.
    }

}
以及我们的可观察的数据源:

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,它可以是。

经过一些搜索和实验,我发现你不能那么容易地通知数据源的每个用户。当调用了
processResponse
时,数据源在每个单独的侦听器上调用
fireCallback
。唉,我无法重新创建功能,但幸运的是,我找到了一个解决方案:

您需要手动使每个侦听器的缓存无效。对于ListGrid,这可以通过
invalidateCache
invalidateDisplayValueCache
的ComboBoxItem来完成。例如:

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

}
公共类ObserverDataSource扩展了DataSource{
私有集处理程序=新HashSet();
公共无效更新(){
for(MyChangeHandler:handler){
handler.onChanged(/*在自身上调用invalidateCache*/);
}
}
}

其他可能的解决方案可能是重新绘制整个
列表网格,但这更有效。

经过一些搜索和实验,我发现您不能那么容易地通知数据源的每个用户。当调用了
processResponse
时,数据源在每个单独的侦听器上调用
fireCallback
。唉,我无法重新创建功能,但幸运的是,我找到了一个解决方案:

您需要手动使每个侦听器的缓存无效。对于ListGrid,这可以通过
invalidateCache
invalidateDisplayValueCache
的ComboBoxItem来完成。例如:

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

}
公共类ObserverDataSource扩展了DataSource{
私有集处理程序=新HashSet();
公共无效更新(){
for(MyChangeHandler:handler){
handler.onChanged(/*在自身上调用invalidateCache*/);
}
}
}
其他可能的解决方案可能是重新绘制整个
列表网格
,但这更有效