2016-06-19 3 views
3

Краткое описание:Почему я не могу обновить навигационную панель (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:

enter image description here

+0

Почему Вам нужно: '@NameToken (AdminNameTokens.test)' в 'TestPresenter'? – masterdany88

+0

@ masterdany88 Причина в том, что NavBar должен зависеть от места. Например. если вы посетите '# item' или что-нибудь« ниже », которое помещается как в' localhost: 8080/# items/дорогиеItems', тогда я хочу, чтобы 'NavBarPresenter' обновлялся на этом событии изменения места. Преимущество состояло бы в том, что 1) он динамически отображает себя и 2) у меня есть опция 'prepareFromRequest', если мне это нужно на панели навигации. Да, я тестировал, если это работает. За кулисами «prepareFromRequest» вызывается, но представление не отображается. – supernickname

+0

@ masterdany88 Хорошо, я могу сейчас говорить об этом мусоре. Если два места указывают на одно и то же место, только один получает вызов на 'prepareFromRequest' или я сломал еще одну вещь сейчас O_o – supernickname

ответ

0

ли Вы пытались заменить PernamentSlot с SingleSlot? Я не уверен, что вы можете обновить PernamentSlot.


ли Вы пытались заменить PresenterWidget с Presenter в расширении класса в MenuPresenter классе?

MenuView - виджет, нет места. Поэтому кажется, что вы не добавляли этот вид в любом месте, поэтому он просто не отображает его. Попытайтесь поставить некоторый статический контент в это представление и увидеть, даже он раскрывается.

Попробуйте в главном окне добавить в конструктор widget.add(new MenuView());. где виджет инициализируется (с использованием java или uibinder).

Для отображения обычного Presenter (это место) У вас должен быть URL-адрес (например, localhost: 8080/myApp | localhost: 8080/myApp # MenuPresenter).

Для отображения PresenterWidget Вы должны позвонить ему где-нибудь!

+0

Привет! Я просто попытался заменить «PemanentSlot» на «SingleSlot», но результат тот же. Да, «MenuView» - это не место, но оно отображается правильно. У меня есть боковой навигатор и навигационная панель, которая получается правильно - единственное, что не работает, это то, что навигационная панель не обновляется. «Меню * .java» не является проблемой. Он добавляется в 'AdminToolPresenter # onBind' (см. Выше). Все работает так, как я ожидал, кроме того, что с навигационной панелью:/ – supernickname

+0

Как вы связываете 'PresenterWidget'? Можете ли вы опубликовать все файлы, связанные с 'Test' *? – masterdany88

+0

Я добавил 'TestView' - вам нужен' .ui.xml' и модуль? В этом нет ничего увлекательного и, как указано в вопросе, вся работа 'Test * .java' работает, если я отрисую ее в' SLOT_AdminToolMainContent'. Так что это не может быть проблемой. – supernickname

0

Согласно документации here:

NestedSlot: То же, что SingleSlot, но может принимать только Презентер, которые имеют Proxies (нет PresenterWidget).

и Вы пытаетесь поставить там PresenterWidget - КОТОРАЯ НЕПРАВИЛЬНО, попробуйте:

  1. заменить NestedSlot с Slot или SingleSlot (принимает PresenterWidget)
  2. или изменить MenuPresenter расширить регулярные Presenter вместо PresenterWidget.

Попробуйте сделать это и дать мне обратную связь.

+0

Но у меня есть 'TestPresenter extends Presenter <>', а не 'TestPresenter extends PresenterWidget <>'. Я не понимаю .. кроме этого .. 'Slot ' или 'SingleSlot ' являются общими. Это означает, что мне понадобится «база» TestBasePresenter, которая «там», без каких-либо дополнительных функций. Я не вижу смысла в этом, это было бы неправильно для меня. Кроме того, что это не делает смысла, потому что он работает, если я рисую его в 'SLOT_AdminToolMainContent', который является' NestedSlot', например 'SLOT_NavBar' – supernickname

+0

. Я знаю, что оба являются' NestedSlot', и он работает для одного, а не для другого, но я думаю, что это не относится к вашей проблеме. Я также думаю, что вы должны использовать для этого 'breadcrumps'' widget'. Пожалуйста, прочитайте еще раз эту статью: http://dev.arcbees.com/gwtp/core/presenters/ Возможно, вам что-то не хватает. Попробуйте воссоздать свой код на основе этого примера. – masterdany88

+0

'MenuPresenter' расширяет' PresenterWidget', что неверно. 'AdminToolPresenter' расширяет' Presenter', что правильно. Вы должны его изменить! – masterdany88

0

Вы должны попробовать clean и install Все ваше приложение и перезапустите SuperDevMode и ваш сервер.

0

Я воссоздал описанную функциональность. Оно работает. Я основываюсь на этой статье Layout example Пример макета. Надеюсь, это поможет.

package pl.korbeldaniel.cms.client.place.app; 
public class AppModule extends AbstractPresenterModule { 
    @Override 
    protected void configure() { 
    install(new UiModule()); 

    bindPresenter(AppPresenter.class, AppPresenter.MyView.class, AppView.class, AppPresenter.MyProxy.class); 
    bindPresenter(HomePresenter.class, HomePresenter.MyView.class, HomeView.class, HomePresenter.MyProxy.class); 
    bindPresenter(ErrorPresenter.class, ErrorPresenter.MyView.class, 
    bindPresenter(TesttPresenter.class, TesttPresenter.MyView.class, TesttView.class, TesttPresenter.MyProxy.class); 

    } 
} 

package pl.korbeldaniel.cms.client.place.app; 

public class AppPresenter extends TabContainerPresenter<AppPresenter.MyView, AppPresenter.MyProxy> implements AppUiHandlers, CurrentUserChangedHandler, AsyncCallStartHandler, AsyncCallFailHandler, AsyncCallSucceedHandler { 
    @ProxyStandard 
    public interface MyProxy extends Proxy<AppPresenter> {} 
    public interface MyView extends TabView, HasUiHandlers<AppUiHandlers> {} 

    public static final NestedSlot SLOT_NavBar = new NestedSlot(); 
    private final TesttPresenter testtPresenter; 

    @Inject 
    AppPresenter(EventBus eventBus, MyView view, MyProxy proxy, TesttPresenter testtPresenter) { 
     super(eventBus, view, proxy, SLOT_TAB_CONTENT, SLOT_REQUEST_TABS, SLOT_CHANGE_TAB, RevealType.Root); 
     this.testtPresenter = testtPresenter; 
     getView().setUiHandlers(this); 
    } 
    @Override 
    protected void onBind() { 
     super.onBind(); 
     setInSlot(SLOT_NavBar, testtPresenter); 
    } 
} 

package pl.korbeldaniel.cms.client.place.app; 

public class AppView extends ViewWithUiHandlers<AppUiHandlers> implements AppPresenter.MyView { 
    public interface Binder extends UiBinder<Widget, AppView> {} 

    @UiField MaterialRow navBarPanel; 

    @Inject 
    AppView(Binder uiBinder) { 
     initWidget(uiBinder.createAndBindUi(this)); 
     bindSlot(AppPresenter.SLOT_NavBar, navBarPanel); 
    } 
} 

<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" 

    <m:MaterialPanel> 
     <m:MaterialRow ui:field="navBarPanel" />       
    </m:MaterialPanel> 
</ui:UiBinder> 

package pl.korbeldaniel.cms.client.playground.test.testt; 

import pl.korbeldaniel.cms.client.place.app.AppPresenter; 

public class TesttPresenter extends Presenter<TesttPresenter.MyView, TesttPresenter.MyProxy> { 
    public interface MyView extends View {} 
    @ProxyStandard 
    public interface MyProxy extends Proxy<TesttPresenter> {} 
    @Inject 
    public TesttPresenter(EventBus eventBus, MyView view, MyProxy proxy) { 
     super(eventBus, view, proxy, AppPresenter.SLOT_NavBar); 
    } 
} 

package pl.korbeldaniel.cms.client.playground.test.testt; 

import pl.korbeldaniel.cms.client.place.app.AppPresenter; 

public class TesttView extends ViewImpl implements TesttPresenter.MyView { 
    public interface Binder extends UiBinder<Widget, TesttView> {} 
    @UiField 
    SimplePanel main; 
    @Inject 
    public TesttView(Binder uiBinder) { 
     initWidget(uiBinder.createAndBindUi(this)); 
     main.add(new Label("____________________________________________________________________________________________________________________>TEST ")); 
     Window.alert("TESTT"); 
     this.bindSlot(AppPresenter.SLOT_NavBar, this.main); 
    } 
} 

<!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"> 
    <g:SimplePanel ui:field="main"></g:SimplePanel> 
</ui:UiBinder> 
+0

Простите, но это не похоже на мою ситуацию. Я считаю, что это работает. Это несколько похоже на то, что я заменяю super (eventBus, view, proxy, MenuPresenter.SLOT_NavBar); 'by' super (eventBus, view, proxy, MenuPresenter.SLOT_NavBar); ' super (eventBus, view, proxy, AdminToolPresenter .SLOT_AdminToolMainContent); 'который также работает для меня отлично. Я по-прежнему придерживался ваших других предложений, таких как изменение «SLOT_Menu» с «PermanentSlot» на «NestedSlot». Кроме того, 'MenuPresenter' теперь является' Presenter' вместо 'PresenterWidget'. Однако это все равно. – supernickname

+0

Я не могу отобразить в 'SLOT_NavBar', и, на мой взгляд, я делаю все как должен. – supernickname

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