0

私のプロジェクトで実装した MVP モデルはパッシブ MVP です。プレゼンターはビューへの参照を持っています。また、プレゼンターには、ビューが従わなければならないディスプレイインターフェイスがあります。

私の現在のディスプレイインターフェースは以下の通りです -

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()ビューによって実装されたそれぞれは、対応するものErrorWidgetを表示し、おそらく対応するものを強調表示しますInputWidget(赤などでマークします)。逆に、各clearXXXError()メソッドは対応する を非表示にし、対応ErrorWidgetする からハイライトを削除しますInputWidget。このように、プレゼンターは CSS 管理を明示的に処理する必要がないため、CSS の変更から切り離されます。ビューだけがそれについて心配する必要があります。

ただし、このアプローチでは、インターフェイス内のエラー関連のメソッドが多すぎます。

私が考えた別のアプローチはErrorWidget、インターフェイスで s を公開することです。しかし、GWT にはHasCss-type インターフェイスがないため、明示的にウィジェット タイプ (たとえば、ラベル) を指定するか、IsWidgetインターフェイスを使用する必要があります (これにより、CSS プロパティだけでなく、ウィジェット全体が再び公開されます)。また、このアプローチでは、プレゼンターで CSS の変更を明示的に指定する必要があります。

私のアプローチに代わるより良い方法はありますか? または、私がしていることは十分ですか?また、現在のアプローチの改善も気に入っています。

4

1 に答える 1

1

このツールチッププラグインの使用を検討できるかもしれません(下部の検証例に注目してください)。ほんの数行のコードでウィジェットを強化します。

プラグインとサンプルのソース コード、およびそれをプロジェクトに追加する方法に関する情報は、この github リポジトリにあります。このリンクには、 例のフォームを強化するために使用するコードがあります。

あなたの場合、フォームウィジェットを次のように設定します。

 @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 に答える