【问题标题】:NestedSlot presenter with own url- how to setup url for NestedSlot presenters具有自己 url 的嵌套插槽演示者-如何为嵌套插槽演示者设置 url
【发布时间】:2016-08-26 23:42:59
【问题描述】:

我有父演示者:UsersListPresenter,其中包含嵌套演示者:UserPresenter 在 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("/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

为了更好地理解,下面是该代码的截屏:

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

这是我的 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框架如何实现?

【问题讨论】:

  • 只是好奇:为什么要更改UsersListPresenter的URL?
  • 不是UsersListPresenter。当窗口出现时是UserTestPresenter 并且它是具有它自己的url 的代理位置。应显示此网址。由于该用户可以从 url 访问具体的用户窗口,而无需手动查找并单击用户。

标签: url gwt proxy gwtp gwt-platform


【解决方案1】:

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

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

您需要覆盖 UserListPresenterprepareFromRequest 方法,然后检查是否设置了用户 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("/users/{userid}")
      .with("userid", event.getUser().getId())
        .build();
    placeManager.revealPlace(placeRequest);
}

这将更改 URL 并打开模式。

【讨论】:

  • 它不起作用。我得到一个网址:http://localhost:8080/cms/#/users/%7Buserid%7D,输入具体的用户网址后:http://localhost:8080/cms/#/users/1 我得到一个错误页面
  • 我没有收到错误消息。它只是显示错误的地方,就像有错误的 ulr f.e.
  • 所以为了澄清您在导航到 http://localhost:8080/cms/#/users/1 时收到错误页面?您是否确保使用 @NameToken("/users/{userid}") 为您的 UserListPresenter 注释您的 ProxyPlace 我还更新了有关 url 转义问题的答案
  • 2 认为不起作用,1. 直接输入具体用户的 url:http://localhost:8080/cms/#/user/3http://localhost:8080/cms/#/users/list 和 1. 当我从 ui 菜单进入用户位置时,我得到了这个丑陋的 url:@ 987654336@- 顺便说一句,当我进入浏览器时,我已经更新了帖子。
  • 您是如何实现User 菜单项的?您需要确保导航到 http://localhost:8080/cms/#/users/li‌​st不是 localhost:8080/cms/#/users
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2013-02-23
  • 2019-06-08
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多