немедленная = "истина" и проблема обязательных полей - PullRequest
1 голос
/ 13 сентября 2011

У меня небольшая проблема с немедленным = "истина" (JSF 1.2). Моя форма касается автомобильной аварии: пользователь заполняет некоторую информацию о ubication, а затем он может добавить столько затронутых предметов, сколько пожелает (деревья, заборы, другие автомобили и т. Д.)

Фасоль

private String location;
private List<T> items;
private HtmlDataTable itemsUI;

public void remove(ActionEvent e) {
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
    items.remove(Integer.parseInt(id));
}   

public void add(ActionEvent e) throws InstantiationException, IllegalAccessException {
    items.add(element.newInstance());
}

JSPX

<h:inputText 
required="true"
value="#{ACC01.location}"/>

<h:dataTable
binding="#{ACC01.itemsUI }"
value="#{ACC01.items}"
var="item">
<h:column>
    <h:selectOneMenu
    value="#{item.id}>
        <f:selectItems  
        value="#{ACC01.possibleElements}" />
    </h:selectOneMenu>

    <h:commandLink 
    actionListener="#{ACC01.remove }"
    value="Remove"  >
        <f:param 
        name="id" 
        value="#{ACC01.itemsUI.rowIndex }"/>
    </h:commandLink>    
</h:column>
</h:dataTable>

<h:commandLink 
actionListener="#{ACC01.add}"
value="Add"  />

Проблема

  • Если я установлю немедленный = "true" для затронутых элементов в dataTable, когда пользователь добавляет новый элемент, другие элементы возвращаются к своим значениям по умолчанию (например, если у вас было {'tree', 'car' , 'fence'} они становятся {'default', 'default', 'default', new element})

  • Если я не использую немедленный, затронутые элементы сохраняют правильные значения, но пользователь вынужден заполнить поле 'location', прежде чем он сможет добавить или удалить затронутые элементы.

Я хочу, чтобы я мог сохранять значения затронутых элементов и позволять пользователю добавлять или удалять их без предварительного заполнения поля 'location'.

Обходной путь

После прочтения многих сообщений на эту тему кажется, что единственный путь - избежать автоматической проверки и выполнить ее вручную, когда пользователь отправляет форму.

Проверьте наличие пустых значений в обязательных полях и программно добавьте сообщения об ошибках в facecontext. Я действительно не хочу этого делать, потому что я думаю, что это ужасно.

Не могли бы вы предложить лучшие способы добиться нужного мне поведения?

Заранее спасибо

1 Ответ

3 голосов
/ 13 сентября 2011

Один из предыдущих разработчиков на моей нынешней работе предложил следующее решение

JSPX

<h:inputText required="#{ACC01.saving}" value="#{ACC01.location}"/>

Фасоль

private UICommand btn;

public boolean isSaving()
{
    Map<?,?> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    return (params.containsKey(btn.getClientId(ctx)));
}

Возможно, это не совсем правильно в вашей ситуации, но в основном он создал привязку от кнопки на экране к переменной 'btn' в компоненте поддержки. Тогда inputText будет видеть только текст местоположения, требуемый при нажатии на btn. В вашем случае это командная ссылка, поэтому она может немного отличаться, но я подумал, что это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...