2016-06-19 9 views
3

短い要約:ナビゲーションバー(PermanentSlot)を更新できないのはなぜですか?

場所変更イベントの後にナビゲーションバーを更新しようとしました。これを行うには、私がSLOT_NavBarでレンダリングしようとしているGWTP Test*.javaを作成しました。しかし、これは動作していません。私が何か間違っているかどうかを確認するために、私はちょうど完全にうまく動作している私のSLOT_AdminToolMainContentスロットにそれ自身をレンダリングしました。問題は、なぜ私はTestViewを1つのスロットにレンダリングできますが、他のスロットにはレンダリングできないことです。 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から何かを得ていません、 "おい、あなたはここで何か変なことをしようとしています"。警告、エラーまたは情報なし。ただ何も私はここで間違って何が表示されません!

enter image description here

+0

は、なぜあなたは必要です: '' TestPresenter'で '@NameToken(AdminNameTokens.test)? – masterdany88

+0

@ masterdany88理由は、NavBarが場所に依存するはずだからです。例えば。 'localhost:8080 /#items/expensiveItems'のように'#item'やそれ以下のものを訪れた場合は、この場所変更イベントで 'NavBarPresenter'を更新します。利点は、1)動的にレンダリングする、2)ナビゲーションバーに必要な場合は 'prepareFromRequest'オプションがあることです。はい、私はこれが動作しているかどうかをテストしました。 'prepareFromRequestが呼び出されても、ビューは表示されません。 – supernickname

+0

@ masterdany88さて、私は今、その人にゴミを言っているかもしれません。 2つの場所が同じ場所を指している場合は、 'prepareFromRequest'を呼び出すことだけが起きるか、別のものが壊れました。O_o – supernickname

答えて

0

あなたがSingleSlotPernamentSlotを交換しようとしなかった:青いバーはあなたがMenuViewで見る<g:SimplePanel ui:field="navBarPanel"/>です:


はあなたにこれがどのように見えるかのアイデアを与えるには? PernamentSlotを更新できるかどうかはわかりません。


あなたはMenuPresenterクラスのクラス拡張にPresenterPresenterWidgetを交換しようとしていましたか?

MenuViewはウィジェットではありませんので、あなたはこのビューをどこにも追加していないようですので、単にそれを表示しません。いくつかの静的コンテンツをこのビューに入れてみてください。

メインビューで試してみてください。コンストラクタで追加しますwidget.add(new MenuView());。ウィジェットは(javaまたはuibinderを使用して)ビュー要素を初期化します。

普通のPresenter(これは場所です)を表示するには、URLが必要です(例:localhost:8080/myApp | localhost:8080/myApp#MenuPresenter)。

表示するPresenterWidgetあなたはどこかに電話する必要があります!

+0

こんにちは!私は 'PemanentSlot'を' SingleSlot'に置き換えようとしましたが、結果は同じです。うん、 'MenuView'は場所ではありませんが、正しく表示されています。私はサイド・ナビゲーションとナビ・バーが正しく描画されています。動作しないのは、ナビゲーション・バーが更新されていないことだけです。 'Menu * .java'は問題ではありません。 'AdminToolPresenter#onBind'(上を参照)に追加されます。私はそれを期待しているので、nav barを使ったこと以外はすべて動作しています:/ – supernickname

+0

'PresenterWidget'をどうやってバインドしますか?すべての 'Test' *関連の完全なファイルを投稿できますか? – masterdany88

+0

'TestView'を追加しました。' .ui.xml'とモジュールも必要ですか?私はそれを 'SLOT_AdminToolMainContent'でレンダリングすると、' Test * .java'というものが動作しています。だから、これは問題になることはありません。 – supernickname

0
ドキュメント hereによると

NestedSlot: プロキシを持ってSingleSlotと同じですが、唯一取ることができ発表なしPresenterWidget)。

とあなたはそこPresenterWidget配置しよう - WRONG IS を、してみてください:SlotまたはSingleSlotNestedSlotを置き換える(PresenterWidgetを受け入れる)、

  • または定期拡張するMenuPresenterを変更

    1. PresenterWidgetの代わりにPresenterです。

    これを試して、フィードバックをください。

  • +0

    しかし、私は 'TestPresenter extends Presenter <> 'ではなく、' TestPresenter extends PresenterWidget <> 'ではなく、' TestPresenter extends Presenter <> 'を持っています。私は理解していません..それ以外は 'Slot 'または 'SingleSlot 'が一般的です。つまり、追加の機能を持たずに「ただそこに」ある「ベースの」TestBasePresenterが必要です。私はそれをする上でのポイントを見ない - これは私に間違って感じるだろう。それ以外は 'SLOT_NavBar'のような' NestedSlot'である 'SLOT_AdminToolMainContent'に描画するとうまくいきませんので、意味がありません – supernickname

    +0

    私は両方とも' NestedSlot'であることを知っていますが、私はあなたの問題のケースではないと思う。この 'breadcrumps'のために'ウィジェット 'を使うべきだと私は思っています。このarticeをもう一度読んでください:http://dev.arcbees.com/gwtp/core/presenters/多分あなたは何かを見逃しています。この例に基づいてYoursコードを再作成してみてください。 – masterdany88

    +0

    'MenuPresenter'は' PresenterWidget'を間違っています。 'AdminToolPresenter'は' Presenter'を拡張しています。あなたはそれを変更する必要があります! – masterdany88

    0

    cleaninstallあなたのアプリケーション全体を再起動し、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);を' super(eventBus、view、proxy、MenuPresenter.SLOT_NavBar);に置き換えた場合と同じです。 super(eventBus、view、proxy、AdminToolPresenter .SLOT_AdminToolMainContent); 'これは私にとっても完璧に機能しています。私は今でも 'SLOT_Menu'を' PermanentSlot'から 'NestedSlot'に変更するようなあなたの提案に従っています。また、 'MenuPresenter'は' PresenterWidget'の代わりに 'Presenter'です。しかし、それはまだ同じです。 – supernickname

    +0

    私は 'SLOT_NavBar'でレンダリングすることができません。 – supernickname

    関連する問題