2012-05-10 4 views
2

私はGWTPを知っています。私は、Piritiマッパーの助けを借りてJSON値を含むテーブルを出力しようとしました。これは実際のプロジェクトのコードではなく、単にGWTPを理解しようとする試みなので、これは最も美しい解決策ではないかもしれません(実際は確かではありません)。ここでは、この手順に関与している2つのプレゼンターは、以下のとおりです。GWTPを使ってテーブルを作成する

FirstPresenter(つまりProductListPresenterを使用して、それはウィジェットで、私はウィジェットがここで使用されるべきであるとわからないんだけど、、this conversationによると、ウィジェットが行うことができますトリック):

public class FirstPresenter extends 
     Presenter<FirstPresenter.MyView, FirstPresenter.MyProxy> { 

    public static final Object SLOT_RATE = new Object(); 
    public static final Object SLOT_PRODUCT = new Object(); 
    private IndirectProvider<ProductListPresenter> productListFactory; 

    public interface MyView extends View { 
     public Panel getListProductPanel(); 
    } 

    @Inject ProductListPresenter productListPresenter; 

    @ProxyCodeSplit 
    @NameToken(NameTokens.first) 
    public interface MyProxy extends ProxyPlace<FirstPresenter> { 
    } 

    @Inject 
    public FirstPresenter(final EventBus eventBus, final MyView view, 
      final MyProxy proxy, Provider<ProductListPresenter> productListFactory) { 
     super(eventBus, view, proxy); 

     this.productListFactory = new StandardProvider<ProductListPresenter>(productListFactory); 
    } 

    @Override 
    protected void revealInParent() { 
    } 

    @Override 
    protected void onBind() { 
     super.onBind(); 
    } 

    @Inject 
    PlaceManager placeManager; 

    @Override 
    protected void onReset() { 
     super.onReset(); 
     setInSlot(SLOT_PRODUCT, null); 
     for (int i = 0; i < 2; i++) { //TODO: change hardcoded value 

      productListFactory.get(new AsyncCallback<ProductListPresenter>() { 

       @Override 
       public void onSuccess(ProductListPresenter result) { 
         addToSlot(SLOT_PRODUCT, result); 
       } 

       @Override 
       public void onFailure(Throwable caught) { 

       } 
      }); 

     } 
    } 

} 

ProductListPresenter

public class ProductListPresenter extends 
     PresenterWidget<ProductListPresenter.MyView> { 

    @Inject ProductListPiritiJsonReader reader; 

    public interface MyView extends View { 
     public Label getNameLabel(); 
     public Label getCompanyLabel(); 
     public Label getSerialLabel(); 
     public Label getPricesLabel(); 
    } 

    @Inject 
    public ProductListPresenter(final EventBus eventBus, final MyView view) { 
     super(eventBus, view); 
    } 

    @Override 
    protected void onBind() { 
     super.onBind(); 
    } 

    @Override 
    protected void onReset() { 
     super.onReset(); 

     try { 
      RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/jsongwtproject/products.json"); 
      rb.setCallback(new RequestCallback() { 
       @Override 
       public void onResponseReceived(Request request, Response response) { 
        ProductList productList = reader.read(response.getText()); 
        for (Product product : productList.getProductList()) { 
         fetchDataFromServer(); 
        } 
       } 
       @Override 
       public void onError(Request request, Throwable exception) { 
        Window.alert("Error occurred" + exception.getMessage()); 
       } 
      }); 
      rb.send(); 
     } 
     catch (RequestException e) { 
      Window.alert("Error occurred" + e.getMessage()); 
     } 
    } 
    //Takes the JSON string and uses showProductListData(String jsonString) method 
    public void fetchDataFromServer() { 
     try { 
      RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/jsongwtpproject/products.json"); 
      rb.setCallback(new RequestCallback() { 
       @Override 
       public void onResponseReceived(Request request, Response response) { 
        showProductListData(response.getText());      
       } 
       @Override 
       public void onError(Request request, Throwable exception) { 
        Window.alert("Error occurred" + exception.getMessage()); 
       } 
      }); 
      rb.send(); 
     } 
     catch (RequestException e) { 
      Window.alert("Error occurred" + e.getMessage()); 
     } 
    } 
    //Uses Piriti mappers to take JSON values 
    private void showProductListData(String jsonString) { 
     ProductList productList = reader.read(jsonString); 
     for (Product product : productList.getProductList()) { 
      StringBuffer priceSb = new StringBuffer(); 
      for (Double price : product.getPrices()) { 
       priceSb.append(price + ", "); 
      } 

      getView().getNameLabel().setText(product.getName()); 
      getView().getCompanyLabel().setText(product.getCompany()); 
      getView().getSerialLabel().setText(product.getSerialNumber()); 
      getView().getPricesLabel().setText(priceSb.toString()); 
      //break; 

     } 
    } 

} 

そしてProductListView.ui.xml

<g:HTMLPanel> 
<table border="1"> 
    <tr> 
     <td><g:Label ui:field="nameLabel" /> </td> 
     <td><g:Label ui:field="companyLabel" /> </td> 
     <td><g:Label ui:field="serialLabel" /> </td> 
     <td><g:Label ui:field="pricesLabel" /> </td> 
    </tr> 
    </table> 
</g:HTMLPanel> 

本当にJSONには2つの製品があります。ここで

は、このコードで何が起こるかです:Product1との最初の行は、それがその後、sの値が、その後、再びProduct2「s「は再びそれがProduct1が含まれ、S値」Product2を含む最初の行に変更し、表示されますProduct1の2番目の行が表示され、次にProduct2の値を含む2番目の行に変更され、再びProduct1の値が入っていて、次にProduct2の値が含まれます。

したがって、2つの製品と2つの行があり、このコードでは値は2回変更されますが、最終的に表にはProduct2の値しか含まれません。 break;のコメントが外されている場合、Product1の値は最初の行で2回出力され、2番目の行ではテーブルにはProduct1の値のみが出力されます。

なぜ起こるのか分かります。しかし、私はまだ正しい出力をする方法を考え出していません。誰かが正しい出力を行う方法を教えてくれたり、例を挙げたり(ウィジェットの使い方など、どの部分がひどく間違っているか)教えてもらえれば嬉しいです。

答えて

1

コードの問題は、実際にはProductListView.ui.xmlに実際のテーブルがないことです。サーバーから取得した二つのレコードがあった場合はもちろん、

、コードのこの部分が2回呼び出されます:

getView().getNameLabel().setText(product.getName()); 
getView().getCompanyLabel().setText(product.getCompany()); 
getView().getSerialLabel().setText(product.getSerialNumber()); 
getView().getPricesLabel().setText(priceSb.toString()); 

2番目の呼び出しは最初の呼び出しから値を上書きします。あなたは本当のテーブルビューを作成するためのCellTableについて読むことをお勧めします

  1. :あなたのコードを改善するための

    ポイント。

  2. PresenterWidget自体をデータホルダーとして使用しないで、代わりに DTOを作成してデータベースに渡し、これを使用して データを取得します。
+0

ありがとう、これは参考になりそうです。 –

関連する問題