【问题标题】:MVP design with GWT ClickHandler使用 GWT ClickHandler 进行 MVP 设计
【发布时间】:2012-06-14 20:22:12
【问题描述】:

使用 GWT 的 ClickHandler 的 MVP 方法是什么?

我的视图中有一个按钮,我想在其中添加一个点击处理程序。

查看 button.addClickHandler(?)

传递了什么?主持人?新的点击处理程序?

示例案例1.查看代码:

this.myButton.addClickHandler(new ClickHandler()
    {
        @Override
        public void onClick(ClickEvent event)
        {
            myPresenter.buttonClicked();
        }
    });

在这种情况下,无法测试为按钮添加点击处理程序...

示例案例 2. Presenter 代码:

this.view.addClickHandlerToButton(this);

    @Override
    public void onClick(ClickEvent event)
    {
        buttonClicked();
    }

在这种情况下,在presenter中引入了GWT代码(ClickEvent),应该避免。

【问题讨论】:

    标签: gwt mvp


    【解决方案1】:

    我是这样解决的:

    注册视图到点击事件, 并在视图中处理:

    点击(){ 演示者.onButtonClicked(); }

    可能该按钮具有一些语义,例如“deleteEntry”,因此演示者方法将是“onDeleteEntryClicked”或“deleteEntry”

    mvp 说让 view 决定使用什么样的 ui 元素,presenter 执行命令。 所以“deleteEntry”背后的逻辑不会改变,而您可以用其他 ui 元素替换按钮 - 也没有 hasClickHandler。

    【讨论】:

    • 此方法有效,但无法测试演示者的链接。这样可以吗?
    【解决方案2】:

    按钮实现了一个叫HasClickHandlers的接口,里面有一个注册点击事件的方法。

    在您的视图界面中,您可以将此界面返回给您的演示者,演示者可以在其上调用 addClickHandler。

    查看界面:

    public MyView extends IsWidget{
        public HasClickHandlers getButton();
    
    }
    

    您的视图实现:

    public HasClickHandler getButton(){
        return button;
    }
    

    在您的演示者中:

    view.getButton().addClickHandler(new ClickHandler(){
    ....
    });
    

    【讨论】:

    • 如果你在presenter中新建了一个ClickHandler,那不是在presenter中暴露视图代码吗,因为ClickHandler和ClickEvent是gwt类?
    • 是的,但它们可以用于单元测试。基本上有两种方法。我描述的那个 - 视图没有任何逻辑。另一种方法是传入演示者并在视图中注册事件并转发它们
    • 问题是,没有clickhandler 的ui 不能轻易地通过其他ui 元素交换按钮。 - 看我的回答
    • 您可以轻松地与实现此接口或使用委托的所有元素进行交换。如果您的用户界面不再提供可点击元素,那么无论如何它都会发生重大变化......我已经使用了这两种方法,它们都有优点/缺点
    • 这不是意义的问题,而是什么部分做什么工作。我认为定义某些动作必须由点击触发不是界面的工作(如果点击和关键事件......应该触发相同的动作怎么办)。说有一些行动就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多