2016-08-25 3 views
0

У меня есть родительский ведущий: UsersListPresenter, который содержит вложенный презентатор: UserPresenter в NestedSlot.Преподаватель NestedSlot с собственным url- как настроить url для презентаторов NestedSlot

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); 
    } 
} 

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 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 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(); 
    } 


} 

, когда пользователь из списка щелкают окно с перешедших пользователей открыт. На данный момент гиперссылки должна изменить от http://localhost:8080/cms/#/users/list к http://localhost:8080/cms/#/user/3

для лучшего понимания ниже скринкаста из этого кода: enter image description here

и теперь некоторая работа, но до сих пор не идеально: enter image description here

здесь является моей конфигурацией gwtp:

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(); 
    } 
} 

As You могу видеть, что я использую tokenFormatter (RouteTokenFormatter.class)

как это можно достичь с помощью системы gwtp?

+0

Просто любопытно: почему вы хотите изменить URL-адрес 'UsersListPresenter'? –

+0

Не 'UsersListPresenter'. Когда появляется окно, это 'UserTestPresenter', и это прокси-сайт с собственным URL-адресом. Этот URL-адрес должен отображаться. Благодаря этому пользователь может получить доступ к конкретному пользовательскому окну из URL-адреса, без необходимости вручную находить и нажимать на пользователя. – masterdany88

ответ

1

Одним из способов достижения этой цели является изменение URL вашего UserListPresenter для поддержки проходящей в идентификатор пользователя в качестве необязательного параметра:

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

Вам необходимо переопределить prepareFromRequest метод вашего UserListPresenter и там проверить если userid установлен и открыть ваше модальное окно, если оно есть.

@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

Он не работает. Я получаю URL-адрес: http: // localhost: 8080/cms/#/users /% 7Buserid% 7D', а после ввода конкретного URL-адреса пользователя: 'http: // localhost: 8080/cms/#/users/1 'Я получаю страницу с ошибкой – masterdany88

+0

что такое сообщение об ошибке? –

+0

Я не получаю сообщение об ошибке. Он просто отображает место ошибки, например, есть неправильный ulr f.e. – masterdany88

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