NestedSlot演示者具有自己的url-如何为NestedSlot演示者设置url

时间:2016-08-25 12:50:50

标签: url gwt proxy gwtp gwt-platform

我有父级演示者:UsersListPresenter,其中包含NestedSlot中的嵌套演示者:UserPresenter

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


}

单击列表中的用户时,将打开包含单击用户的窗口。此时网址应该从<{1}}更改为<{1}}

为了更好地理解下面是该代码的截屏视频: enter image description here

现在完成了一些工作,但仍然不理想: enter image description here

这是我的gwtp配置:

http://localhost:8080/cms/#/users/list

如您所见,我使用 tokenFormatter(RouteTokenFormatter.class)

如何用gwtp框架实现?

1 个答案:

答案 0 :(得分:1)

实现此目的的一种方法是更改​​UserListPresenter的网址,以支持将用户ID作为可选参数传递:

@NameToken("/users/{userid}")
public interface MyProxy extends ProxyPlace<UserListPresenter> {
}

您需要覆盖prepareFromRequest的{​​{1}}方法,然后检查用户ID是否已设置,如果是,则打开模态窗口。

UserListPresenter

当您单击列表中的用户时,还需要更改逻辑:

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

这将更改URL并打开模式。