2016-08-25 20 views
0

親プレゼンター:UsersListPresenterネストされたプレゼンター:UserPresenterがNestedSlotにあります。リストからユーザーがクリックしたユーザーを持つウィンドウをクリックするNestedSlotプレゼンターがNestedSlotプレゼンターのためのURLを設定する方法


public class UserTestView extends ViewWithUiHandlers<UserTestUiHandlers> implements UserTestPresenter.MyView { 
    interface Binder extends UiBinder<Widget, UserTestView> {} 

    @UiField 
    MaterialRow main; 
    @UiField 
    MaterialWindow window; 
    @UiField 
    MaterialLabel userName, userFullName; 
    @UiField 
    MaterialButton saveButton; 
    private HandlerRegistration saveButtonClickHandler; 

    @Inject 
    UserTestView(Binder uiBinder) { 
     initWidget(uiBinder.createAndBindUi(this)); 
     // adding default click handler 
     saveButtonClickHandler = saveButton.addClickHandler(new ClickHandler() { 
      @Override 
      public void onClick(ClickEvent event) {} 
     }); 
    } 

    @Override 
    public void openModal(final UserDto user) { 
     userName.setText(user.getEmail()); 
     userFullName.setText(user.getId() + " " + user.getEmail()); 
     saveButtonClickHandler.removeHandler(); 
     saveButtonClickHandler = saveButton.addClickHandler(new ClickHandler() { 
      @Override 
      public void onClick(ClickEvent event) { 
       getUiHandlers().save(user); 
      } 
     }); 
     window.openWindow(); 
    } 


} 

public class UserTestPresenter extends Presenter<UserTestPresenter.MyView, UserTestPresenter.MyProxy> implements UserTestUiHandlers { 
    public interface MyView extends View, HasUiHandlers<UserTestUiHandlers> { 
     void openModal(UserDto user); 
    } 
    @ProxyStandard 
    @NameToken("/user/{userid}") 
    public interface MyProxy extends ProxyPlace<UserTestPresenter> { 
    } 

    private PlaceManager placeManager; 

    @Inject 
    public UserTestPresenter(EventBus eventBus, MyView view, MyProxy proxy, PlaceManager placeManager) { 
     super(eventBus, view, proxy, UsersListPresenter.SLOT_USER_WINDOW); 
     this.placeManager = placeManager; 
     getView().setUiHandlers(this); 

    } 
    @Override 
    public void prepareFromRequest(PlaceRequest request) { 
     GWT.log("Prepare from request " + request.getNameToken()); 
    } 
    @Override 
    protected void onReveal() { 
     super.onReveal(); 
    }; 
    public void openModal(UserDto user) { 
     getView().openModal(user); 
    } 
    @Override 
    public void onSave(UserDto user) { 
     // TODO Auto-generated method stub 
     MaterialToast.fireToast("onSaveClick in new presenter for " + user.toString()); 
    } 
    @Override 
    public void onClose() { 
     PlaceRequest placeRequest = new PlaceRequest.Builder().nameToken("https://stackoverflow.com/users/{userid}").with("userid", "list").build(); 
     placeManager.revealPlace(placeRequest); 
    } 
public class UsersListView extends ViewWithUiHandlers<UsersListUiHandlers> implements UsersListPresenter.MyView { 
    interface Binder extends UiBinder<Widget, UsersListView> {} 

    @UiField 
    SimplePanel windowSlot; 

    @Inject 
    UsersListView(Binder uiBinder) { 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
    @Override 
    public void setInSlot(Object slot, IsWidget content) { 
     if (slot == UsersListPresenter.SLOT_USER_WINDOW) { 
      windowSlot.setWidget(content); 
     } 
    }; 
} 


public class UsersListPresenter extends ApplicationPresenter<UsersListPresenter.MyView, UsersListPresenter.MyProxy> implements UsersListUiHandlers, 
OpenWindowEvent.OpenModaHandler, UserAddedEvent.UserAddedHandler { 
    @ProxyStandard 
    @NameToken(ClientRouting.Url.users) 
    @UseGatekeeper(IsUserLoggedGatekeeper.class) 
    public interface MyProxy extends TabContentProxyPlace<UsersListPresenter> {} 

    @TabInfo(container = AppPresenter.class) 
    static TabData getTabLabel(IsUserLoggedGatekeeper adminGatekeeper) { 
     return new MenuEntryGatekeeper(ClientRouting.Label.users, 1, adminGatekeeper); 
    } 

    public interface MyView extends View, HasUiHandlers<UsersListUiHandlers> { 
     void setUsers(List<UserDto> users); 
     void addUser(UserDto user); 
    } 

    public static final NestedSlot SLOT_USER_WINDOW = new NestedSlot(); 
    //interface Driver extends SimpleBeanEditorDriver<UserDto, UserEditor> {} 
    private static final UserService userService = GWT.create(UserService.class); 
    private AppPresenter appPresenter; 
    private UserTestPresenter userPresenter; 

    @Inject 
    UsersListPresenter(EventBus eventBus, MyView view, MyProxy proxy, AppPresenter appPresenter, UserTestPresenter userPresenter) { 
     super(eventBus, view, proxy, appPresenter, AppPresenter.SLOT_TAB_CONTENT); 
     this.appPresenter = appPresenter; 
     this.userPresenter = userPresenter; 
     getView().setUiHandlers(this); 
    } 
    @Override 
    protected void onBind() { 
     super.onBind(); 
     updateList(); 
     setInSlot(SLOT_USER_WINDOW, userPresenter); 
     addRegisteredHandler(OpenWindowEvent.getType(), this); 
    } 
    @Override 
    protected void onReveal() { 
     super.onReveal(); 
     initializeApplicationUiComponents(ClientRouting.Label.users); 
    } 

    @Override 
    public void onOpenModal(OpenWindowEvent event) { 
     openModal(event.getUser()); 
    } 
    @Override 
    public void openModal(UserDto user) { 
     userPresenter.openModal(user); 
    } 
} 
が開かれます。 enter image description here

、今いくつかの仕事を、まだ理想的ではない:ここ enter image description here

この瞬間URLは以下のそのコードからスクリーンキャストでより良く理解するためにhttp://localhost:8080/cms/#/user/3

http://localhost:8080/cms/#/users/listからを変更する必要があります

public class ClientModule extends AbstractPresenterModule { 

    @Override 
    protected void configure() { 
     bind(RestyGwtConfig.class).asEagerSingleton(); 
     install(new Builder()// 
     .defaultPlace(ClientRouting.HOME.url)// 
     .errorPlace(ClientRouting.ERROR.url)// 
     .unauthorizedPlace(ClientRouting.LOGIN.url)// 
     .tokenFormatter(RouteTokenFormatter.class).build()); 
     install(new AppModule()); 
     install(new GinFactoryModuleBuilder().build(AssistedInjectionFactory.class)); 
     bind(CurrentUser.class).in(Singleton.class); 
     bind(IsAdminGatekeeper.class).in(Singleton.class); 
     bind(IsUserLoggedGatekeeper.class).in(Singleton.class); 
     bind(ResourceLoader.class).asEagerSingleton(); 
    } 
} 

私はgwtpの設定です私はtokenFormatter(RouteTokenFormatter.class)を使用することができます

どのようにgwtpフレームワークで達成することができますか?これを達成するための

+0

ちょうど興味深い:なぜあなたは 'UsersListPresenter'のURLを変更したいのですか? –

+0

'UsersListPresenter'ではありません。ウィンドウが表示されたときは 'UserTestPresenter'であり、プロキシの場所は自分のURLです。このURLが表示されます。そのユーザーは、手動で検索してユーザーをクリックする必要なく、URLから具体的なユーザーウィンドウにアクセスできます。 – masterdany88

答えて

1

一つの方法は、オプションのパラメータとしてユーザIDを渡してサポートするために、あなたのUserListPresenterのURLを変更することです:あなたはあなたがチェックし、あなたのUserListPresenter、そこのprepareFromRequestメソッドをオーバーライドする必要が

@NameToken("https://stackoverflow.com/users/{userid}") 
public interface MyProxy extends ProxyPlace<UserListPresenter> { 
} 

ユーザーIDが設定されている場合は、モーダルウィンドウを開きます。

@Override 
public void prepareFromRequest(PlaceRequest request) { 
    String userid = request.getParameter("userid", "list"); 
    if (userid != "list") { 
     # open modal 
    } 
    else { 
     # close modal 
    } 
} 

また、あなたは、リスト内のユーザーにあなたをクリックしたときにロジックを変更する必要があります。

@Override 
public void onOpenModal(OpenWindowEvent event) { 
    PlaceRequest placeRequest = new PlaceRequest.Builder() 
     .nameToken("https://stackoverflow.com/users/{userid}") 
     .with("userid", event.getUser().getId()) 
     .build(); 
    placeManager.revealPlace(placeRequest); 
} 

これは、URLを変更し、モーダルを開きます。

+0

それはうまくいきません。 http:// localhost:8080/cms /#/ users /%7Buserid%7D'というURLがあります。具体的なユーザーURLを入力した後、http:// localhost:8080/cms /#/ users/1 'エラーメッセージが表示されます – masterdany88

+0

エラーメッセージは何ですか? –

+0

エラーメッセージが表示されません。それは間違ったulr f.eがあるようにエラー箇所を表示するだけです。 – masterdany88

関連する問題