Краткое описание:Почему я не могу обновить навигационную панель (PermanentSlot)?
Я пытаюсь обновить навигационную панель после события изменения места. Для этого я создал GWTP Test*.java
, который я пытаюсь сделать в SLOT_NavBar
. Однако это не работает. Чтобы убедиться, что я сделал что-то не так, я просто сделал рендеринг в своем слоте SLOT_AdminToolMainContent
, который работает отлично. Вопрос в том, почему я могу сделать TestView
в одном слоте, но не в другом. GWTP не дает мне никаких подсказок о том, что я делаю неправильно здесь, и я не могу найти ничего в документации, которая поможет мне здесь.
Я уверен, что проблема должна быть либо непониманием с моей стороны, либо чем-то действительно глупым, что я делаю, но я просто не вижу причины, почему это не работает.
У меня здесь "корень" ведущий:
AdminToolPresenter.java
public class AdminToolPresenter extends Presenter<AdminToolPresenter.MyView, AdminToolPresenter.MyProxy> {
public interface MyView extends View {
}
@ProxyStandard
@NameToken(AdminNameTokens.adminTool)
@UseGatekeeper(AdminGatekeeper.class)
public interface MyProxy extends ProxyPlace<AdminToolPresenter> {
}
/** */
public static final PermanentSlot<MenuPresenter> SLOT_Menu = new PermanentSlot<>();
/** */
public static final NestedSlot SLOT_AdminToolMainContent = new NestedSlot();
/** */
private MenuPresenter menuPresenter;
@Inject
public AdminToolPresenter(EventBus eventBus, MyView view, MyProxy proxy, MenuPresenter menuPresenter) {
super(eventBus, view, proxy, RevealType.RootLayout);
this.menuPresenter = menuPresenter;
}
@Override
protected void onBind() {
this.setInSlot(SLOT_Menu, this.menuPresenter);
}
@Override
protected void onReveal() {
LOGGER.fine("AdminToolPresenter.onReveal()");
}
}
и его вид:
AdminToolView.java
public class AdminToolView extends ViewImpl implements AdminToolPresenter.MyView {
@SuppressWarnings("unused")
private final static Logger LOGGER = Logger.getLogger(AdminToolView.class.getName());
public interface Binder extends UiBinder<Widget, AdminToolView> {
}
@UiField HTMLPanel menuPanel;
@UiField SimplePanel adminMainContent;
@Inject
public AdminToolView(Binder uiBinder) {
this.initWidget(uiBinder.createAndBindUi(this));
this.bindSlot(AdminToolPresenter.SLOT_Menu, this.menuPanel);
this.bindSlot(AdminToolPresenter.SLOT_AdminToolMainContent, this.adminMainContent);
}
}
Все Я делаю с этим работает нормально, например:
TestPresenter.java
public class TestPresenter extends Presenter<TestPresenter.MyView, TestPresenter.MyProxy> implements TestUiHandlers {
private final static Logger LOGGER = Logger.getLogger(TestPresenter.class.getName());
interface MyView extends View , HasUiHandlers<TestUiHandlers> {
}
@NameToken(AdminNameTokens.test)
@ProxyStandard
interface MyProxy extends ProxyPlace<TestPresenter> {
}
@Inject
TestPresenter(EventBus eventBus, MyView view, MyProxy proxy) {
// This is working just fine. The content gets displayed correctly in the SLOT_AdminToolMainContent slot
super(eventBus, view, proxy, AdminToolPresenter.SLOT_AdminToolMainContent);
this.getView().setUiHandlers(this);
}
@Override
public void prepareFromRequest(PlaceRequest request) {
LOGGER.severe("prepareFromRequest");
super.prepareFromRequest(request);
}
}
TestView.java
class TestView extends ViewWithUiHandlers<TestUiHandlers> implements TestPresenter.MyView {
interface Binder extends UiBinder<Widget, TestView> {
}
@UiField SimplePanel main;
@Inject TestView(Binder uiBinder) {
this.initWidget(uiBinder.createAndBindUi(this));
}
}
Никаких проблем! Однако, если я пытаюсь связать это с другой слот:
Вопрос
@Inject
TestPresenter(EventBus eventBus, MyView view, MyProxy proxy) {
// MenuPresenter.SLOT_NavBar instead of AdminToolPresenter.SLOT_AdminToolMainContent
super(eventBus, view, proxy, MenuPresenter.SLOT_NavBar);
this.getView().setUiHandlers(this);
}
Тогда это просто делает ничего! Я только изменил слот - так почему это не работает? Вот MenuPresenter
и связанной с ними код:
MenuPresenter.java
public class MenuPresenter extends PresenterWidget<MenuPresenter.MyView> implements MenuUiHandlers {
private final static Logger LOGGER = Logger.getLogger(MenuPresenter.class.getName());
interface MyView extends View, HasUiHandlers<MenuUiHandlers> {
}
/** Slot for the navigation bar. */
public static final NestedSlot SLOT_NavBar = new NestedSlot();
@Inject
MenuPresenter(EventBus eventBus, MyView view) {
super(eventBus, view);
this.getView().setUiHandlers(this);
}
@Override
protected void onReveal() {
LOGGER.severe("onReveal()");
}
}
MenuView.java
class MenuView extends ViewWithUiHandlers<MenuUiHandlers> implements MenuPresenter.MyView {
interface Binder extends UiBinder<Widget, MenuView> {
}
@UiField HTMLPanel navBarPanel;
@UiField MaterialSideNav sideNav;
private PlaceManager placeManager;
@Inject MenuView(Binder uiBinder, PlaceManager placeManager) {
this.initWidget(uiBinder.createAndBindUi(this));
this.bindSlot(MenuPresenter.SLOT_NavBar, this.navBarPanel);
this.placeManager = placeManager;
}
}
MenuView.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:m="urn:import:gwt.material.design.client.ui"
xmlns:m.addins="urn:import:gwt.material.design.addins.client.ui">
<ui:with field="tokens" type="com.mz.client.admin.place.AdminNameTokens"/>
<ui:style gss="true">
/* .. */
</ui:style>
<g:HTMLPanel ui:field="main">
<g:HTMLPanel addStyleNames="{style.navbar-wrapper}">
<g:SimplePanel ui:field="navBarPanel" />
</g:HTMLPanel>
<m:MaterialHeader>
<m:MaterialNavBar backgroundColor="white" activates="sideNav" layoutPosition="RELATIVE" addStyleNames="{style.nav-bar}">
<m:MaterialNavSection>
</m:MaterialNavSection>
</m:MaterialNavBar >
<m:MaterialSideNav ui:field="sideNav" m:id="sideNav" type="FIXED" alwaysShowActivator="true" width="280" addStyleNames="{style.side-nav}" >
<m:MaterialLink targetHistoryToken="{tokens.getHome}" iconType="HOME" iconPosition="LEFT" textColor="black" text="Home" />
</m:MaterialSideNav>
</m:MaterialHeader>
</g:HTMLPanel>
</ui:UiBinder>
Пожалуйста, объясните мне, почему это не работает - меня заводит. Я ничего не получаю от GWTP, как «чувак, вы пытаетесь сделать что-то странное здесь». Нет предупреждений, ошибок или информации. Просто ничего, и я не вижу, что я делаю неправильно здесь!
Чтобы дать вам представление о том, как это выглядит: Синий бар является <g:SimplePanel ui:field="navBarPanel"/>
, который вы видите в MenuView:
Почему Вам нужно: '@NameToken (AdminNameTokens.test)' в 'TestPresenter'? – masterdany88
@ masterdany88 Причина в том, что NavBar должен зависеть от места. Например. если вы посетите '# item' или что-нибудь« ниже », которое помещается как в' localhost: 8080/# items/дорогиеItems', тогда я хочу, чтобы 'NavBarPresenter' обновлялся на этом событии изменения места. Преимущество состояло бы в том, что 1) он динамически отображает себя и 2) у меня есть опция 'prepareFromRequest', если мне это нужно на панели навигации. Да, я тестировал, если это работает. За кулисами «prepareFromRequest» вызывается, но представление не отображается. – supernickname
@ masterdany88 Хорошо, я могу сейчас говорить об этом мусоре. Если два места указывают на одно и то же место, только один получает вызов на 'prepareFromRequest' или я сломал еще одну вещь сейчас O_o – supernickname