私は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
の値のみが出力されます。
なぜ起こるのか分かります。しかし、私はまだ正しい出力をする方法を考え出していません。誰かが正しい出力を行う方法を教えてくれたり、例を挙げたり(ウィジェットの使い方など、どの部分がひどく間違っているか)教えてもらえれば嬉しいです。
ありがとう、これは参考になりそうです。 –