【问题标题】:GWTP create new presenter each timeGWTP 每次创建新的演示者
【发布时间】:2016-11-23 21:06:57
【问题描述】:

我有:

  • 简单的嵌套演示者 (ChannelPresenter),其中包含包含记录的表(网格)。我需要在每个 ChannelPresenter.displayEditor() 调用中创建新的 ChannelEditorPresenter 实例。
  • Popup Presenter 小部件 (ChannelEditorPresenter) 应在每个 ChannelEditorPresenter.edit() 调用中显示弹出窗口

目前我将 ChannelEditorPresenter 注入到 ChannelPresenter 构造函数,但在这种情况下,我只有一个 ChannelEditorPresenter 实例。实际上,每次通话我都需要单独的 Popup 演示者。 (很多分离的窗口,每个都有自己的数据)。

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);
    }
}

【问题讨论】:

    标签: java gwtp gwt-platform


    【解决方案1】:

    我在这里找到了解决方案:Instantiate a PresenterWidget (GWTP) manually

    我需要注入 com.google.inject.Provider 而不是普通的 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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我们最近遇到了同样的问题,我们发现最好的方法是使用带有 @Assisted 注释的 WidgetsFactory,正如 Arcbees 的博客文章中提到的那样:http://blog.arcbees.com/2015/04/01/gwt-platform-event-best-practices-revisited/

      这很有用,尤其是当您需要将不同的参数传递给演示器小部件的构造函数时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多