【问题标题】:Adding inject section in project在项目中添加注入部分
【发布时间】:2016-09-13 09:57:02
【问题描述】:

我的 gin 库有问题。我不明白如何将它包含在项目中。项目很简单。(我是为了了解gin做的,但是还是没搞懂,这个项目应该是用gin库的)

我们的第一页带有按钮和复选框。如果复选框的值 - true 我们可以按下我们的按钮,这允许在第二页上添加新按钮。你们能帮我完成这个例子吗?我添加了一个根包,其中包含 RootView、IRootView 和 RootPresenter。 RootView 必须包含 Page1 和 Page2。我应该在 RootPresenter 中添加什么?哪个小部件应该包含 RootView 中的两个页面?我如何将 Page1 和 Page2 注入 RootView ?

谁能帮我提些建议?如果你能帮助一些代码更好,这将有助于我理解杜松子酒。

Project structure

Page1的界面

public interface IPage1View extends IsWidget {
    public Button getAddButton();
    public CheckBox getCheckBox();

    public interface IPage1Presenter{}
}

第 1 页的演示者

    @Presenter(view = Page1View.class)
public class Page1Presenter extends BasePresenter<IPage1View, AppEventBus> implements IPage1View.IPage1Presenter{
    @Override
    public void bind() {
        view.getCheckBox().setValue(true);
        view.getAddButton().addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                eventBus.addNewButton();
            }
        });
        view.getCheckBox().addValueChangeHandler(new ValueChangeHandler<Boolean>() {
            @Override
            public void onValueChange(ValueChangeEvent<Boolean> event) {
                if(event.getValue()){
                    eventBus.enableMOM();
                }
                else {
                    eventBus.disableMOM();
                }
            }
        });
    }

    public void onStart(){
        RootPanel.get("page1").add(view);
    }

    public void onEnableMOM(){
        view.getAddButton().setEnabled(true);
    }
    public void onDisabledMOM(){
        view.getAddButton().setEnabled(false);
    }}

Page1View

public class Page1View extends ReverseCompositeView<IPage1View.IPage1Presenter> implements IPage1View{

    private Button addButton;
    private CheckBox checkBox;

    Page1View(){
        SimplePanel mainPanel = new SimplePanel();
        DecoratorPanel backgroundPanel = new DecoratorPanel();
        addButton = new Button("Add new button");
        checkBox = new CheckBox("Enable adding new buttons");
        VerticalPanel content = new VerticalPanel();
        content.setSize("400px","400px");
        content.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
        content.add(addButton);
        content.add(checkBox);
        backgroundPanel.add(content);
        mainPanel.add(backgroundPanel);
    }

    @Override
    public Button getAddButton() {
        return addButton;
    }

    @Override
    public CheckBox getCheckBox() {
        return checkBox;
    }
}

与 Page2 几乎相同。为了节省地方,我不发布它。

事件总线

@Events(startView = Page1.class)
public interface AppEventBus extends EventBus {

    @Start
    @Event(handlers = {Page1Presenter.class, Page2Presenter.class, Page3Presenter.class, Page4Presenter.class})
    public void start();

    @Event(handlers = {Page1Presenter.class}, activate = Page2Presenter.class)
    public void enableMOM();

    @Event(handlers = {Page1Presenter.class}, deactivate = Page2Presenter.class)
    public void disableMOM();

    @Event(handlers = Page2Presenter.class)
    public void addNewButton();

    @Event(handlers = Page2Presenter.class)
    public void deleteSomeButton(Button killerButton);

    @Event(handlers = Page3Presenter.class)
    public void getData();

    @Event(handlers = Page4Presenter.class)
    public void addNewPoint();
}

并且根包元素与Page1具有相同的结构,但它们是空的。我不知道应该包含哪些代码。

任何有使用 gin + mvp4g 经验的人可以帮助我吗?

更新: 我正在尝试自己执行此操作,但仍然存在错误。( 我做了什么:

public interface IRootView extends IsWidget{
    interface IRootPresenter{}
}

我用 UIBinder 制作了 RooView。

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
             xmlns:g='urn:import:com.google.gwt.user.client.ui'>
    <g:HTMLPanel>
        <g:SimplePanel ui:field="page1">

        </g:SimplePanel>
        <g:SimplePanel ui:field="page2">

        </g:SimplePanel>
    </g:HTMLPanel>
</ui:UiBinder>

这些面板应该包含我们的 page1 和 page2(我怎么想)。 但是当我尝试注入它们时 - 我的类型有错误。

public class RootView extends ReverseCompositeView<IRootView.IRootPresenter> 

    implements IRootView {

        @UiField
        SimplePanel page1, page2;

        @Inject
        public RootView(Page1View page1, Page2View page2){
            //how to add them ?
        }

        interface RootViewUiBinder extends UiBinder<Widget, RootView> {
        }

        private static RootViewUiBinder ourUiBinder = GWT.create(RootViewUiBinder.class);

        public RootView() {
            initWidget(ourUiBinder.createAndBindUi(this));
        }
    }

RootPresenter

 @Presenter(view = RootView.class)
    public class RootPresenter extends BasePresenter<IRootView, AppEventBus> implements IRootView.IRootPresenter{
        public void onStart(){

        }
    }

【问题讨论】:

    标签: java gwt gwt-gin mvp4g


    【解决方案1】:

    首先,您应该使用最新版本的 mvp4g (1.5.0)。您可以在此处找到最新版本:https://github.com/mvp4g/mvp4g/releases

    视图和服务由 mvp4g 注入。所以,没有必要为此使用 GIN。

    如果你需要注入其他东西,只需为这个类创建一个 Provider:

    public class MyClassProvider
      implements Provider<MyClass> {
    
      static MyClass myClass = new MyClass();
    
      @Override
      public MyClass get() {
        return MyClass;
      }
    }
    

    接下来你需要一个设置 GIN 的类:

    public class MyApplicationGinModule
      extends AbstractGinModule {
    
      @Override
      protected void configure() {
        bind(MyClass.class).toProvider(MyClassProvider.class)
                           .in(Singleton.class);
      }
    }
    

    一旦你有了这个类,你就可以轻松地将它添加到事件总线中:

    @Events(startPresenter = Page1Presenter.class,
            ginModules = MyApplicationGinModule.class)
     public interface AppEventBus extends EventBus {
        ...
     }
    

    在这里您可以找到更多信息:https://github.com/mvp4g/mvp4g/wiki/08.-GIN-Integration

    【讨论】:

    • 谢谢回答。我项目中的哪个类是提供者?
    • 你要注入哪个类?
    • 我希望 RootView 包含 Page1 和 Page2。我认为这里是注射。
    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 2012-07-13
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多