2016-08-25 34 views
0

我有父母主持人:UsersListPresenter包含巢式主持人:UserPresenter在NestedSlot。NestedSlot主講人與自己的網址 - 如何設置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(); 
    } 


} 

當從列表中的用戶點擊與用戶單擊該窗口被打開。這時URL應該從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(); 
    } 
} 

就像你可以看到我用的tokenFormatter(RouteTokenFormatter.class)

如何用gwtp框架實現呢?實現這一

+0

只是好奇:你爲什麼要改變'UsersListPresenter'的URL? –

+0

不是'UsersListPresenter'。當窗口顯示爲「UserTestPresenter」時,它是代理位置,並具有自己的URL。應該顯示此網址。由於該用戶可以從url訪問具體的用戶窗口,而無需手動查找並點擊用戶。 – masterdany88

回答

1

的一種方法是改變你UserListPresenter的URL,以支持用戶ID傳遞作爲可選的參數:

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

你需要重寫你的UserListPresenterprepareFromRequest方法有你檢查如果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