2012-07-05 106 views
0

我有一天发布了一个问题,并没有得到太多的回应。我尝试了一些东西,但仍然没有运气。我正尝试在GWTP中嵌套选项卡演示者。我有一个框架(北)是选项卡组1和一个框架(西)是选项卡组2.我与组1交互时,我更新控制组2的嵌套选项卡演示者。我已查看嵌套选项卡的示例主持人,但我一直无法确定我的错误。嵌套选项卡gwtp

两个TabContainerPresenter是ManagementTabsPresenter和SettingsTabsPresenter。这些孩子就像下面的HomePresenter。这些孩子的内容显示在位于MainPreseter中的DockLayoutPanel的中心。我想让ManagementTabsPresenter和SettingsTabsPresenter显示在同一个DockLayoutPanel的West插槽中。

当我运行这段代码时,所有东西都放在屏幕上的正确位置。您甚至可以单击选项卡并执行操作。问题首先在于,即使默认页面是HomePresenter,也会先显示SettingsPresenter。这就像它试图在启动时同时显示两者。然后,当您选择任何属于ManagementTabsPresenter或SettingsTabsPresenter的选项卡时,它将在MainPresenter.Center_Slot中打开正确的内容,但MainPresenter.West_Slot中会显示不正确的演示者。我无法弄清楚这里有什么问题。任何帮助,将不胜感激。

下面是代码:

public class HomePresenter extends Presenter<HomePresenter.MyView, HomePresenter.MyProxy> { 
@Inject 
AppPlaceManager appPlaceManager; 

@NameToken(NameTokens.homePage) 
@ProxyStandard 
@NoGatekeeper 
public interface MyProxy extends TabContentProxyPlace<HomePresenter> { 
} 

public interface MyView extends View { 
} 

@TabInfo(container = ManagementTabsPresenter.class) 
static TabData getTabLabel(MainAppGinjector injector) { 
    return new TabDataBasic("home", 0); 
} 

@Inject 
public HomePresenter(final EventBus eventBus, final MyView view, final MyProxy proxy) { 
    super(eventBus, view, proxy); 
} 

@Override 
protected void revealInParent() { 
    RevealContentEvent.fire(this, ManagementTabsPresenter.TYPE_MAIN_CONTENT_SLOT, this); 
} 
} 





public class ManagementTabsPresenter extends TabContainerPresenter<ManagementTabsPresenter.MyView, ManagementTabsPresenter.MyProxy> { 

/** 
* {@link ManagementTabsPresenter}'s proxy. 
*/ 
@ProxyStandard 
public interface MyProxy extends NonLeafTabContentProxy<ManagementTabsPresenter> { 
} 

/** 
* {@link ManagementTabsPresenter}'s view. 
*/ 
public interface MyView extends TabView { 
} 

/** 
* Use this in leaf presenters, inside their {@link #revealInParent} method. 
*/ 
@ContentSlot 
public static final GwtEvent.Type<RevealContentHandler<?>> TYPE_MAIN_CONTENT_SLOT = MainPresenter.CENTER_SLOT; 


/** 
* This will be the event sent to our "unknown" child presenters, in order for 
* them to register their tabs. 
*/ 
@RequestTabs 
public static final Type<RequestTabsHandler> TYPE_Management_RequestTabs = new Type<RequestTabsHandler>(); 

@TabInfo(container = HeaderTabsPresenter.class, nameToken = NameTokens.homePage) 
static TabData getTabLabel(MainAppGinjector injector) { 
    return new TabDataBasic("Management", 0); 
} 

@Inject 
public ManagementTabsPresenter(final EventBus eventBus, final MyView view, 
           final MyProxy proxy, AppPlaceManager appPlaceManager) { 
    super(eventBus, view, proxy,TYPE_MAIN_CONTENT_SLOT, TYPE_Management_RequestTabs); 
} 


@Override 
protected void revealInParent() { 
    RevealContentEvent.fire(this, HeaderTabsPresenter.TYPE_VERTICAL_TABS_SLOT, this); 
} 
} 



public class SettingsTabsPresenter extends TabContainerPresenter<SettingsTabsPresenter.MyView, SettingsTabsPresenter.MyProxy> { 

/** 
* {@link SettingsTabsPresenter}'s proxy. 
*/ 
@ProxyStandard 
public interface MyProxy extends NonLeafTabContentProxy<SettingsTabsPresenter> { 
} 

/** 
* {@link SettingsTabsPresenter}'s view. 
*/ 
public interface MyView extends TabView { 
} 

@TabInfo(container = HeaderTabsPresenter.class, nameToken = NameTokens.appUserCollectionPage) 
static TabData getTabLabel(MainAppGinjector injector) { 
    return new TabDataBasic("Settings", 1); 
} 

/** 
* Use this in leaf presenters, inside their {@link #revealInParent} method. 
*/ 
@ContentSlot 
public static final GwtEvent.Type<RevealContentHandler<?>> TYPE_MAIN_CONTENT_SLOT = MainPresenter.CENTER_SLOT; 


/** 
* This will be the event sent to our "unknown" child presenters, in order for 
* them to register their tabs. 
*/ 
@RequestTabs 
public static final Type<RequestTabsHandler> TYPE_Settings_RequestTabs = new Type<RequestTabsHandler>(); 

@Inject 
public SettingsTabsPresenter(final EventBus eventBus, final MyView view, 
           final MyProxy proxy, AppPlaceManager appPlaceManager) { 
    super(eventBus, view, proxy,TYPE_MAIN_CONTENT_SLOT, TYPE_Settings_RequestTabs); 
} 


@Override 
protected void revealInParent() { 
    RevealContentEvent.fire(this, HeaderTabsPresenter.TYPE_VERTICAL_TABS_SLOT, this); 
} 
} 


public class HeaderTabsPresenter extends TabContainerPresenter<HeaderTabsPresenter.MyView, HeaderTabsPresenter.MyProxy> { 
@Inject EventBus eventBus; 

/** 
* {@link HeaderTabsPresenter}'s proxy. 
*/ 
@ProxyStandard 
public interface MyProxy extends Proxy<HeaderTabsPresenter> { 
} 

/** 
* {@link HeaderTabsPresenter}'s view. 
*/ 
public interface MyView extends TabView { 
    void changeTab(Tab tab, TabData tabData, String historyToken); 
} 

/** 
* This will be the event sent to our "unknown" child presenters, in order for 
* them to register their tabs. 
*/ 
@RequestTabs 
public static final Type<RequestTabsHandler> TYPE_HEADER_RequestTabs = new Type<RequestTabsHandler>(); 

/** 
* Fired by child proxie's when their tab content is changed. 
*/ 
@ChangeTab 
public static final Type<ChangeTabHandler> TYPE_HEADER_ChangeTab = new Type<ChangeTabHandler>(); 

@ContentSlot 
public static final Type<RevealContentHandler<?>> TYPE_VERTICAL_TABS_SLOT = MainPresenter.WEST_SLOT; 

@Inject 
public HeaderTabsPresenter(final EventBus eventBus, final MyView view, 
          final MyProxy proxy) { 
    super(eventBus, view, proxy, TYPE_VERTICAL_TABS_SLOT, TYPE_HEADER_RequestTabs, TYPE_HEADER_ChangeTab); 
} 


@Override 
protected void revealInParent() { 
    RevealContentEvent.fire(this, MainPresenter.NORTH_SLOT, this); 
} 

} 



public class MainPresenter extends Presenter<MainPresenter.MyView, MainPresenter.MyProxy>{ 

@Inject VSMRequestFactory requestFactory; 
@Inject VSMMessages vsmMessages; 
@Inject VSMExceptionMessages vsmExceptionMessages; 
@Inject EventBus eventBus; 

@ProxyStandard 
@NoGatekeeper 
public interface MyProxy extends Proxy<MainPresenter> { 
} 

public interface MyView extends View { 

} 

@ContentSlot 
public static final Type<RevealContentHandler<?>> SOUTH_SLOT = new Type<RevealContentHandler<?>>(); 
@ContentSlot 
public static final Type<RevealContentHandler<?>> WEST_SLOT = new Type<RevealContentHandler<?>>(); 
@ContentSlot 
public static final Type<RevealContentHandler<?>> CENTER_SLOT = new Type<RevealContentHandler<?>>(); 
@ContentSlot 
public static final Type<RevealContentHandler<?>> NORTH_SLOT = new Type<RevealContentHandler<?>>(); 

@Inject 
public MainPresenter(EventBus eventBus, MyView view, MyProxy proxy) { 
    super(eventBus, view, proxy); 
} 

@Override 
protected void revealInParent() { 
    RevealRootLayoutContentEvent.fire(this, this); 
} 

@Override 
protected void onReveal() { 
    super.onReveal(); 
    initializeAppUser(); 
} 

} 

回答

0

我偶然发现了以前类似的东西...我认为这是因为他们两人从TabContainerPresenter继承,并且有在gwtp调用onReveal一个bug()上错误的继承孩子。

看看这个gwtp论坛帖子: https://groups.google.com/forum/?fromgroups#!searchin/gwt-platform/gilad$20egozi/gwt-platform/p0s3BlN-ceE/5EL3nynaiu4J

是否如此?如果是这样,我认为没有人提交gwtp问题跟踪器的错误,请告诉我。

(当然,最好的检查是不要继承,看看它是否工作)

+0

谢谢!!!是的,这正是发生的事情! – 2012-07-05 18:58:48

+0

我通过让我的子选项卡触发MainPresenter.CENTER_SLOT中的显示并使用未使用的RevealContentHandler触发嵌套选项卡演示者(管理或设置)的显示,从而解决了此问题。 – 2012-07-05 19:08:09

+0

所以我的TabContainerPresenter的包含公共静态最终类型> TYPE_SETTINGS_MAIN_CONTENT_SLOT = new Type >();和我的孩子主持人看起来像这样@Override protected void revealInParent(){ RevealContentEvent.fire(this,MainPresenter.CENTER_SLOT,this); RevealContentEvent.fire(this,ManagementTabsPresenter.TYPE_MAIN_CONTENT_SLOT,this); } – 2012-07-05 19:08:24