2012-01-12 120 views
1

我正嘗試使用GXT框架創建一個相當簡單的GWT應用程序,並且正在基於電子書「Ext GWT 2.0初學者指南」進行此操作。它詳細介紹了使用GXT的MVC模型構建應用程序的所有步驟,其中大部分步驟都按預期工作,但我無法 - 在其生命週期中 - 向我的網格添加新行。如何將行添加到GXT網格

Grid數據的初始加載(通過itemStore,loader和RPCProxy正常工作)。但是每次我觸發添加新行的事件時,我想要添加的ListStore都是空的(不爲空!但是爲空) - 即使我的Grid在初始加載後顯示數據!

下面是一些有關的代碼的:

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()是由所屬組件調用(一個這篇LayoutContainer已被添加到其中)。

如果我在addMessage()方法中設置了一個斷點,我的itemStore的大小爲0(同樣適用於grid.getStore())。

我已經嘗試了對這段代碼的各種不同的更改,我還沒有看到正在添加的行。

在類似的說明:如果在addMessage()方法內,我嘗試從代理重新加載 - 因爲我也更新服務器端數據 - 即。 loader.load(),它沒有任何可見的效果。

回答

1

加載器將會是異步的 - 它需要等待服務器(MarketingService)返回值。你確定這是返回一個非空列表嗎?通過用你自己的回調替代你的代理中的回調來驗證這一點,該回調檢查返回給客戶端的內容(如果服務器拋出異常,甚至可能根本不會被調用)。

如果在onRender或稍後調用addMessage,則可能爲時過早,並且服務器可能尚未返回數據,因此商店可能仍爲空。如果從按鈕點擊或其他東西調用,這不會是一個問題。

檢查您的日誌是否有異常,您是否將代理處理項目列表傳遞給期望ListLoadResult的Loader - 這也可能是錯誤的來源。 GXT 2中令人困惑的泛型應該主要在3版中解決,目前該版本正處於測試階段。

+0

加載程序正在運行並填充網格。直到應用程序加載完畢,Grid纔會顯示MarketingService中的現有記錄,然後單擊(測試)按鈕,然後觸發addMessage()的調用。所以我無法想象這與你剛纔提到的有關。 – uncrase 2012-01-12 22:37:00

+0

好的 - 很難從提供的內容中知道。如果網格中的項目可見,那麼商店仍然有項目(即使addMessage調用沒有看到任何項目),這表明可能正在使用錯誤的存儲 - 甚至可能是MessageGrid的錯誤實例。簡單的方法來驗證 - 步入addMessage,並確保this.grid.attached是真實的。如果是這樣,那麼不管怎樣,你都要交易網格,商店,或者找到了一種方法來清除網格而不用繪製更改。 – 2012-01-12 23:10:53

+0

我剛剛檢查過... grid.attached在通過addMessage()方法時顯示爲false。 – uncrase 2012-01-12 23:24:20