2013-03-29 2 views
0

Модель MVP, которую я реализовал в моем проекте, - это Passive MVP. Ведущий имеет ссылку на представление. Кроме того, презентатор имеет интерфейс отображения, который должен соблюдать вид.Управление ошибками и CSS в представлении через презентатор

Мой текущий интерфейс дисплея, как показано ниже -

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. Но GWT, не имеющий интерфейса HasCss, должен был либо явно указывать тип виджетов (скажем, ярлык), либо использовать интерфейс IsWidget (который снова выведет весь виджет, а не только его свойства CSS). Кроме того, в этом подходе я должен был бы явно указать модификации CSS в презентаторе.

Есть ли лучшая альтернатива моему подходу? Или что я делаю, достаточно хорошо? Мне также понравились бы улучшения в моем нынешнем подходе.

+1

Вы используя Рамку редактора GWT? Если это так, проверьте интерфейс 'HasEditorError ', если каждый элемент управления способен отображать собственные ошибки, вы можете просто делегировать туда ... –

ответ

1

Возможно, вы могли бы рассмотреть возможность использования этого плагина tooltip (сфокусируйтесь на примере проверки внизу). Это улучшает ваши виджеты с очень небольшим количеством строк кода.

Исходный код плагина и примеров, а также информация о том, как добавить его в ваш проект, находится в this github repo. И у In this link у вас есть кусок кода, который они используют для улучшения формы своего примера.

В вашей установке случае вашей формы виджетов с:

@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 (на основе идентификаторов или классы), что-то вроде:

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

и реализации этого метода в представлении может быть:

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

Как вы можете видеть, это решение не навязчиво в том смысле, что плагин не должен ничего знать о вашей реализации виджетов, и вы не обязаны реализовывать определенные интерфейсы в своих виджетах и ​​т. Д.