0

我在项目中实现的 MVP 模型是 Passive MVP。演示者具有对视图的引用。此外,presenter 有一个 Display 接口,视图必须遵守。

我当前的显示界面如下 -

public interface Display {
    Widget asWidget();

    <Control extends HasValue<String> & HasBlurHandlers> Control code();
    <Control extends HasValue<String> & HasBlurHandlers> Control name();
    <Control extends HasValue<String> & HasBlurHandlers> Control address();
    <Control extends HasValue<String> & HasBlurHandlers> Control contactNumber1();
    <Control extends HasValue<String> & HasBlurHandlers> Control contactNumber2();
    <Control extends HasValue<String> & HasBlurHandlers> Control email();
    <Control extends HasValue<String> & HasBlurHandlers> Control registrationNumber();
    <Control extends HasValue<String> & HasBlurHandlers & HasEnabled> Control registrationYear();

    HasClickHandlers saveControl();
    HasClickHandlers cancelControl();

    void setCodeError(String message);
    void setNameError(String message);
    void setAddressError(String message);
    void setContactNumber1Error(String message);
    void setEmailError(String message);
    void setRegistrationNumberError(String message);

    void clearCodeError();
    void clearNameError();
    void clearAddressError();
    void clearContactNumber1Error();
    void clearEmailError();
    void clearRegistrationNumberError();
}

这里的痛苦是用于设置/清除输入错误消息的方法。每个setXXXError()由 View 实现的都会使相应的ErrorWidget可见,并且可能还会突出显示相应的InputWidget(通过将其标记为红色或其他东西)。相反,每个clearXXXError()方法都会隐藏对应的ErrorWidget,并从对应的 中移除高亮InputWidget。这样,presenter 就不必明确地处理 CSS 管理,从而将自己与 CSS 的变化脱钩。只有视图必须担心它。

但是,这种做法最终导致接口中有太多与错误相关的方法。

我想到的另一种方法是ErrorWidget在界面中公开 s 。但是,GWT 没有HasCss-type 接口,我必须要么显式指定小部件类型(例如,标签),要么使用IsWidget接口(这将再次公开整个小部件,而不仅仅是其 CSS 属性)。此外,在这种方法中,我必须在演示者中明确指定 CSS 修改。

我的方法有更好的选择吗?还是我所做的已经足够好?我也希望我目前的方法有任何改进。

4

1 回答 1

1

也许你可以考虑使用这个工具提示插件(关注底部的验证示例)。它用很少的代码行来增强你的小部件。

插件和示例的源代码,以及有关如何将其添加到项目中的信息都在这个 github repo中。在这个链接中, 您可以看到他们用来增强示例表单的代码。

在您的情况下,设置您的表单小部件:

 @UiField TextBox myTextBoxWidget;

 $(myTextBoxWidget).id("textbox1").as(Tooltip).tooltip(new TooltipOptions()
            .withContent("Password cannot be empty")
            .withTrigger(TooltipTrigger.MANUAL)
            .withPlacement(TooltipPlacement.RIGHT)
            .withResources(ValidationTooltipResources.INSTANCE));

然后在您的视图中,您可以添加一个方法来通知演示者哪些小部件有错误,我将使用 CSS 选择器(基于 id 或类),例如:

 myView.setError("#texbox1, #texbox2");

并且该方法在视图中的实现可能是:

 public void setError(cssSelector) {
   $(*, this).removeClass("invalid");
   $(cssSelector, this).addClass("invalid");
 }

正如您所看到的,这个解决方案不是侵入性的,因为插件不需要了解您的小部件实现的任何信息,并且您不必被迫在小部件中实现某些接口等。

于 2013-03-29T23:19:01.950 回答