2016-11-23 17 views
0

у меня есть:GWTP создать новый Presenter каждый раз

  • Простой Уплотненный ведущий (ChannelPresenter), который имеет таблицу (сетки) с записями в нем. Мне нужно создать новый экземпляр ChannelEditorPresenter в каждом вызове ChannelPresenter.displayEditor().
  • Popup Presenter Widget (ChannelEditorPresenter), который должен отображать всплывающие окна в каждом ChannelEditorPresenter.edit() вызов

В настоящее время я инъекционный ChannelEditorPresenter в ChannelPresenter конструктора, но в этом случае у меня есть только один экземпляр ChannelEditorPresenter. На самом деле мне нужен отдельный презентатор всплывающих окон для каждого вызова. (Много отдельных окон, каждая из которых имеет собственные данные).

ChannelPresenter.java:

public class ChannelPresenter extends Presenter<ChannelPresenter.MyView, ChannelPresenter.MyProxy> implements ChannelUiHandlers { 

    public interface MyView extends View, HasUiHandlers<ChannelUiHandlers> { 
     void load(); 
    } 

    @ProxyStandard 
    @NameToken(NameTokens.CHANNELS) 
    interface MyProxy extends ProxyPlace<ChannelPresenter> { 
    } 

    ChannelEditorPresenter channelEditorPresenter; 

    @Inject 
    ChannelPresenter(EventBus eventBus, MyView view, MyProxy proxy, 
        ChannelEditorPresenter channelEditorPresenter 
        ) { 
     super(eventBus, view, proxy, ApplicationPresenter.SLOT_MAIN); 
     getView().setUiHandlers(this); 
     this.channelEditorPresenter = channelEditorPresenter; 
    } 

    @Override 
    protected void onBind() { 
     super.onBind(); 
     getView().load(); 
    } 

    @Override 
    public void displayEditor(Channel channel) { 
     // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     // Here I need to create new instance for each call 
     // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     addToPopupSlot(channelEditorPresenter); 
     channelEditorPresenter.edit(channel); 
    } 
} 

ответ

0

Я нашел решение здесь: Instantiate a PresenterWidget (GWTP) manually

Мне нужно Вводят com.google.inject.Provider <ChannelEditorPresenter> вместо обычного ChannelEditorPresenter.

ChannelPresenter.java:

public class ChannelPresenter extends Presenter<ChannelPresenter.MyView, ChannelPresenter.MyProxy> implements ChannelUiHandlers { 

    public interface MyView extends View, HasUiHandlers<ChannelUiHandlers> { 
     void load(); 
    } 

    @ProxyStandard 
    @NameToken(NameTokens.CHANNELS) 
    interface MyProxy extends ProxyPlace<ChannelPresenter> { 
    } 

    Provider<ChannelEditorPresenter> channelEditorPresenterProvider; 

    @Inject 
    ChannelPresenter(EventBus eventBus, MyView view, MyProxy proxy, 
        Provider<ChannelEditorPresenter> channelEditorPresenterProvider 
        ) { 
     super(eventBus, view, proxy, ApplicationPresenter.SLOT_MAIN); 
     getView().setUiHandlers(this); 
     this.channelEditorPresenterProvider = channelEditorPresenterProvider; 
    } 

    @Override 
    protected void onBind() { 
     super.onBind(); 
     getView().load(); 
    } 

    @Override 
    public void displayEditor(Channel channel) { 
     ChannelEditorPresenter channelEditorPresenter = channelEditorPresenterProvider.get(); 
     addToPopupSlot(channelEditorPresenter); 
     channelEditorPresenter.edit(channel); 
    } 
} 
0

У нас была такая же проблема в последнее время, и мы обнаружили, что лучший способ заключается в использовании WidgetsFactory с @Assisted аннотацию, как уже упоминалось в блоге опубликовать Arcbees': http://blog.arcbees.com/2015/04/01/gwt-platform-event-best-practices-revisited/

Это полезно, особенно если вам нужно передать различные параметры конструктору виджета ведущего.