短い要約:ナビゲーションバー(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から何かを得ていません、 "おい、あなたはここで何か変なことをしようとしています"。警告、エラーまたは情報なし。ただ何も私はここで間違って何が表示されません!
は、なぜあなたは必要です: '' TestPresenter'で '@NameToken(AdminNameTokens.test)? – masterdany88
@ masterdany88理由は、NavBarが場所に依存するはずだからです。例えば。 'localhost:8080 /#items/expensiveItems'のように'#item'やそれ以下のものを訪れた場合は、この場所変更イベントで 'NavBarPresenter'を更新します。利点は、1)動的にレンダリングする、2)ナビゲーションバーに必要な場合は 'prepareFromRequest'オプションがあることです。はい、私はこれが動作しているかどうかをテストしました。 'prepareFromRequestが呼び出されても、ビューは表示されません。 – supernickname
@ masterdany88さて、私は今、その人にゴミを言っているかもしれません。 2つの場所が同じ場所を指している場合は、 'prepareFromRequest'を呼び出すことだけが起きるか、別のものが壊れました。O_o – supernickname