Изменить выбранный элемент JSF h: selectManyCheckbox при событии - PullRequest
0 голосов
/ 24 августа 2011

У меня есть два поля на моем сайте.Входной текст и selectManyCheckbox.Во входном тексте пользователь пишет дату вроде 30.03.2014.У selectManyCheckbox есть все дни недели (понедельник, вторник ...).Я пытаюсь добиться этого, если пользователь пишет в дате, день недели для этой даты проверяется в selectManyCheckbox.Например, 30.03.2014 следует проверить воскресенье.

Вот код моего jsp:

<h:inputText value="#{course.startTime}" onblur="submit()" valueChangeListener="#{course.intervalDayEvent}" immediate="true">
    <f:converter converterId="dateConverter" />
</h:inputText>

<h:selectManyCheckbox layout="pageDirection" value="#{course.days}">
  <f:selectItems value="#{course.availableDays}" />
</h:selectManyCheckbox>

А вот код управляемогоBean:

private List<String> days = new ArrayList<String>();
private List<SelectItem> availableDays = new ArrayList<SelectItem>();

@PostConstruct
public void init() {

    availableDays.add(new SelectItem("Montag", "Montag"));
    availableDays.add(new SelectItem("Dienstag", "Dienstag"));
    availableDays.add(new SelectItem("Mittwoch", "Mittwoch"));
    availableDays.add(new SelectItem("Donnerstag", "Donnerstag"));
    availableDays.add(new SelectItem("Freitag", "Freitag"));
    availableDays.add(new SelectItem("Samstag", "Samstag"));
    availableDays.add(new SelectItem("Sonntag", "Sonntag"));
    days.add("Montag");

}

public void intervalDayEvent(ValueChangeEvent event) {

    try {
        Date date = (Date) event.getNewValue();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int day = cal.get(Calendar.DAY_OF_WEEK);

        days.clear();

        switch (day) {
        case Calendar.MONDAY:
            days.add("Montag");
            break;
        case Calendar.TUESDAY:
            days.add("Dienstag");
            break;
        case Calendar.WEDNESDAY:
            days.add("Mittwoch");
            break;
        case Calendar.THURSDAY:
            days.add("Donnerstag");
            break;
        case Calendar.FRIDAY:
            days.add("Freitag");
            break;
        case Calendar.SATURDAY:
            days.add("Samstag");
            break;
        case Calendar.SUNDAY:
            availableDays.get(6).setLabel("Test");
            days.add("Sonntag");
            break;
        }

    } catch (Exception ex) {
        log.warn(ex.getMessage());
    }

    FacesContext context = FacesContext.getCurrentInstance();
    context.renderResponse();
}

Как видите, понедельник (Montag) предварительно проверен.Если я введу 30.03.2014 в текст ввода, метка воскресенья изменится на «Тест».Но проверенный пункт не меняется с понедельника по воскресенье.

Я надеюсь, что вы можете помочь мне с этим.:)

Бенджамин

1 Ответ

1 голос
/ 24 августа 2011

Я предполагаю, что вводимый текст и selectManyCheckbox находятся в той же форме? Я не вижу, что делает функция JS submit (), но я понимаю, что это просто отправка всей формы. То, что происходит, это то, что intervalDayEvent запускается, но затем, поскольку форма была отправлена, selectManyCheckbox затем устанавливает значение своего компонента в компоненте поддержки.

Чтобы обойти это, вам нужно иметь эти компоненты в 2 различных формах или использовать некоторые элементы управления ajax, которые будут устанавливать входной текст только при изменении этого значения, а не всю форму. Пример этого может быть показан ниже с RichFaces, но я уверен, что вы можете сделать это с другими библиотеками JSF ajax:

<h:inputText value="#{course.startTime}" valueChangeListener="#{course.intervalDayEvent}">
    <a4j:support event="onblur" reRender="daysChkBox" ajaxSingle="true"></a4j:support>
</h:inputText>
<h:selectManyCheckbox id="daysChkBox" layout="pageDirection" value="#{course.days}">
    <f:selectItems value="#{course.availableDays}"></f:selectItems>
</h:selectManyCheckbox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...