データソース操作を聞き、SmartGWTでリスナーに通知する

DataSourceフィールドが別のDataSourceの値に依存しているとします。その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.
    }

}

そして我々の観測可能なデータソース:

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のすべてのユーザーに簡単に通知することはできないことがわかりました。データソースは、 processResponse が呼び出されたときに、別々のリスナごとに fireCallback を呼び出します。ああ、私は機能を再現することができませんでしたが、幸いにも私は状況の回避策を見つけました:

各リスナーのキャッシュを手動で無効化する必要があります。 ListGridの場合、これは invalidateCache と、 invalidateDisplayValueCache を使用したComboBoxItemで行うことができます。例えば。:

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
追加された