2012-01-12 10 views
1

GXTフレームワークを使用してかなり単純なGWTアプリケーションを作成しようとしています。これはeBook「Ext GWT 2.0初心者ガイド」に基づいています。それは、GXTのMVCモデルを使ってアプリケーションを構築するためのすべてのステップを詳述しています。そのほとんどは期待どおりに動作していますが、グリッドに新しい行を追加することはできません。GXTグリッドに行を追加する方法

グリッドデータの初期読み込み(itemStore、loader、およびRPCProxyが正しく動作します)。

ただし、新しい行の追加をトリガーするイベントが発生するたびに、追加したいListStoreは空です(nullではありませんが空です) - 初期ロード後にグリッドにデータが表示されていますが! ()(これは、このLayoutContainerが添加されたビュー)所有しているコンポーネントによって呼び出されている

public class MessageGrid extends LayoutContainer { 
    private final Grid<ModelData> grid; 
    private final ListLoader<ListLoadResult<MarketingMessage>> loader; 
    private final ListStore<ModelData> itemStore; 
    public MessageGrid() { 
     setLayout(new FitLayout()); 
     final MarketingServiceAsync marketingService = Registry.get(MarketingUIConstants.MARKETING_SERVICE); 
     RpcProxy<List<MarketingMessage>> proxy = new RpcProxy<List<MarketingMessage>>() { 
      @Override 
      protected void load(Object loadConfig, final AsyncCallback<List<MarketingMessage>> callback) { 
       marketingService.getMessages(callback); 
      } 
     }; 
     final List<ColumnConfig> columns = new ArrayList<ColumnConfig>(); 
     columns.add(new ColumnConfig("col1", "Name", 100)); 
     columns.add(new ColumnConfig("col2", "Phone", 100)); 
     final ColumnModel columnModel = new ColumnModel(columns);  
     loader = new BaseListLoader<ListLoadResult<MarketingMessage>>(proxy); 
     itemStore = new ListStore<ModelData>(loader); 
     grid = new Grid<ModelData>(itemStore, columnModel); 
     grid.setBorders(true); 
     grid.setAutoExpandColumn("sentTime"); 
     grid.setAutoHeight(false); 
     grid.setHeight("100%");  
    } 

    @Override 
    protected void onRender(Element parent, int index) { 
     super.onRender(parent, index); 
     loader.load(); 
     add(grid); 
    } 

    public void addMessage(MarketingMessage marketingMessage) { 
     itemStore.add(new MarketingMessage("test", "test"))); 
    } 
} 

そしてaddMessage:

ここ関連するコードの一部です。

addMessage()メソッド内にブレークポイントを設定した場合、itemStoreのサイズは0になります(同じことについては、grid.getStore()と同じです)。

私はこのコードに様々な変更を加えましたが、まだ追加されている行を見ています。

同様の注意:addMessage()メソッドの内部では、プロキシからリロードを試みます。サーバー側のデータも更新します。 loader.load()、にも表示される効果はありません。

答えて

1

ローダーは非同期になります。サーバー(MarketingService)が値を返すのを待つ必要があります。これが空でないリストを返していることは確かですか?これを確認するには、プロキシ内のコールバックを、クライアントに返された内容をチェックする独自のコールバックに置き換えます(サーバーが例外をスローした場合でも呼び出しはされません)。

addResponderがonRenderと呼ばれていたり、すぐに呼び出された場合、早すぎる可能性があります。サーバーがまだデータを返さなかった可能性があります。ボタンのクリックなどから呼び出された場合、これは問題にはなりません。

ログで例外をチェックすると、ListLoadResultが必要なローダーにアイテムのリストを処理するプロキシが渡されています。これもエラーの原因となる可能性があります。 GXT 2の混乱しているジェネリックは、現在ベータ版である3でほとんど解決されるはずです。

+0

ローダーが機能し、グリッドにデータを入力しています。アプリが読み込まれるまでではなく、(テスト)ボタンをクリックしたMarketingServiceの既存のレコードがGridに表示され、addMessage()が呼び出されます。だから私はこれがあなたがちょうど言及したものと関連しているとは想像できません。 – uncrase

+0

オクラホマ - 提供されたものからは分かりませんでした。グリッドにアイテムが表示されている場合、ストアにアイテムが残っています(addMessage呼び出しにアイテムが見えなくても)。おそらく誤ったストアが使用されている可能性があります。簡単な検証方法 - addMessageにステップインし、this.grid.attachedがtrueであることを確認します。そうであれば、どういうわけかグリッド、店舗を交換したり、変更を描画せずにグリッドをクリアする方法を見つけたりしています。 –

+0

私はちょっとチェックしました... grid.attachedはaddMessage()メソッドを実行中にfalseとして表示されています。 – uncrase

関連する問題