2012-05-10 10 views
2

Я знакомлюсь с GWTP. Я попытался вывести таблицу, которая будет содержать значения JSON, взятые с помощью Piriti-карт. Это не настоящий код проекта, это просто попытка понять GWTP, так что это может быть не самое красивое решение (на самом деле это не совсем точно). Вот две ведущие, которые участвуют в этой процедуре:Создание таблицы с использованием 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> 

Currrently есть два продукта в JSON.

Вот что происходит с этим кодом: первая строка с Product1 появляется, то она меняется на первую строку, содержащую Product2 «значения s, то опять содержит Product1» значения s, то опять Product2 «с, после чего появляется вторая строка с Product1, затем она изменяется во вторую строку, которая содержит значения Product2, а затем она содержит значения Product1, а затем Product2.

Итак, есть два продукта и две строки, и в этом коде значения меняются дважды, но в конце таблица содержит только значения Product2. Если break; раскоментирован, значения Product1 выводятся дважды в первой строке, а затем во второй строке, тогда таблица содержит только эти значения Product1.

Я понимаю, почему это происходит. Но я еще не понял, как сделать правильный вывод. Было бы здорово, если бы кто-нибудь мог сказать мне, как делать правильный вывод, или, ну, дайте пример (или скажите, какая часть, например, использование виджета, ужасно ошибочна).

ответ

1

Проблема с вашим кодом в том, что у вас действительно нет реальной таблицы в ProductListView.ui.xml.

Конечно, если были две записи, извлекаемые с сервера, эта часть кода вызывается дважды:

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

второй вызов перезапись значения из первого вызова.

Очки улучшить свой код:

  1. Вы можете прочитать о CellTable для создания реального представления таблицы.
  2. Не используйте сам PresenterWidget в качестве держателя данных, вместо этого создайте DTO, который будет проходить к базе данных и использовать его для получения данных .
+0

Спасибо, это кажется полезным. –

Смежные вопросы