2013-06-23 2 views
0

У меня есть простое JSF приложение с формой, один из элементов управления будучи :ч: selectOneListBox не работает

<h:selectOneListbox style="width: 231px; height: 27px;position:absolute;left:400px;top:325px;" value="#{PatientsSearch.selectedDoctor}"> 
    <f:selectItems value="#{PatientsSearch.doctors}" var="d" itemLabel="#{d.name}" itemValue="#{d.name}" /> 
</h:selectOneListbox> 

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

Я отладил приложение и заметил, что после выбора элемента в списке обратные вызовы других кнопок в форме не срабатывают при нажатии на них. Также в отладчике я никогда не видел setSelectedDoctor(), который вызывается (см. Фрагмент выше), как я и ожидал.

Я использую реализацию Mojarra 2.0.1 JSF.

Что мне здесь не хватает?


Update: Это вся форма:

<h:form style="width: 876px; background-color: #FED981; padding-left: 60px; padding-top: 30px; margin-left: 80px; margin-top: 40px; color: #804000; font-style: normal; font-family: Verdana, Arial, Sans-Serif"> 
    <h:outputLabel style="position:absolute;left:200px;top:100px;" value="New appointment:"></h:outputLabel> 
    <br> 
    <br> 
    <h:inputText style="width: 259px;position:absolute;left:200px;top:120px;" binding="#{PatientsSearch.inputText1}" valueChangeListener="#{PatientsSearch.lookForName}" immediate="true" id="inputText1" /> 
    <h:commandButton value ="Search patients by name:" style="width: 173px;position:absolute;left:465px;top:120px;" action="#{PatientsSearch.getPatientsByName}"> 
     <f:param name="day" value="#{request.getParameter('day')}" /> 
     <f:param name="month" value="#{request.getParameter('month')}" /> 
     <f:param name="year" value="#{request.getParameter('year')}" /> 
    </h:commandButton> 

    <br> 
    <h:panelGroup id="pn_DETAILS_GRP" style="overflow:auto;position:absolute;top:155px;left:200px;width:300px;height:150px;solid black"> 
     <h:dataTable id="tb_USER_DETAILS" border="1" var="patient" value="#{PatientsSearch.patients}" style="width:300px;height:150px" rowClasses="oddRow, evenRow"> 
     <h:column id="name"> 
     <f:facet name="header"> 
     <h:outputText value="Name" style="font-size:10pt"/> 
     </f:facet> 
     <h:outputText value="#{patient.name}" style="font-size:8pt"/> 
     </h:column> 
     <h:column id="phone"> 
     <f:facet name="header"> 
     <h:outputText value="Phone" style="font-size:10pt"/> 
     </f:facet> 
     <h:outputText value="#{patient.phoneMobile}" style="font-size:8pt"/> 
     </h:column> 
     <h:column> 
     <h:inputHidden id="patientId" value="#{patient.id}" /> 
     </h:column> 
     </h:dataTable> 
    </h:panelGroup> 

    <h:inputHidden id="testId" /> 

    <br><br><br> 
    <h:outputLabel value="Choose doctor:" style="width: 200px;position:absolute;left:200px;top:325px;"></h:outputLabel> 
    <h:selectOneListbox style="width: 231px; height: 27px;position:absolute;left:400px;top:325px;" value="#{PatientsSearch.selectedDoctor}" size="1"> 
     <f:selectItems value="#{PatientsSearch.doctors}" var="d" 
      itemLabel="#{d.name}" itemValue="#{d.name}" /> 
    </h:selectOneListbox> 
    <br><br><br> 
    <h:commandButton value="Schedule" style="position:absolute;left:200px;top:430px;" action="#{PatientsSearch.scheduleAppointment}"> 
     <f:param name="day" value="#{request.getParameter('day')}" /> 
     <f:param name="month" value="#{request.getParameter('month')}" /> 
     <f:param name="year" value="#{request.getParameter('year')}" /> 
    </h:commandButton> 

</h:form> 
+0

Вы должны добавить некоторые другие части вашей формы, включая кнопку. На первый взгляд это может быть конверсия ошибки проверки, есть ли у вас «h: messages» где-то? –

+0

В этой форме нет кнопки? _Все другие кнопки, похоже, простаивают, они больше не реагируют на клики. Какие? Каковы геттеры/сеттеры для '# {PatientsSearch.selectedDoctor}' и '# {d.name}'? –

+0

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

ответ

0

Согласно комментариям, проблема заключается в том, что тип для #{d.name} не то же самое, как #{PatientsSearch.selectedDoctor}. В такой ситуации есть два решения:

  1. Храните все, что у вас есть, измените #{PatientsSearch.selectedDoctor} геттер/сеттер на тип String.
  2. Создайте список SelectItem в бэкэн-бэнне и смените getter/setter #{PatientsSearch.selectedDoctor} на тип String. Вы также сможете удалить itemValue и itemLabel, поскольку бэк-компонент уже предоставляет готовые объекты для компонентов списка.
  3. Изменить атрибут itemValue из f:selectItems и создать пользовательский преобразователь

Я предпочитаю второй, так как он лучше разделить мнение. Это должно быть изменено следующим образом:

<h:selectOneListbox style="width: 231px; height: 27px;position:absolute;left:400px;top:325px;" value="#{PatientsSearch.selectedDoctor}" size="1"> 
    <f:selectItems value="#{PatientsSearch.doctors}" var="d" itemLabel="#{d.name}" /> 
    <f:converter convertId="doctorConverter" /> 
</h:selectOneListbox> 

Теперь для преобразователя, вы можете запустить его, как это:

@FacesConverter(value="doctorConverter") 
public class DoctorConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     // Your code, select doctor from value ID for example. 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     // Your code, return doctor ID from value. 
    } 
} 
+0

Спасибо Alexandre, что вы говорите, имеет смысл, но это кажется более сложным, чем это. Если я использую itemValue = "# {d}", то это еще хуже, чем раньше: остальные кнопки не работают даже в первый раз. Альтернативой является создание всех строк (т. Е. «SelectedDoctor»), а затем кнопки, похоже, работают, но выбор выглядит странно - все объекты Doctor кажутся сериализованными и конкатенированными, и это то, что я получаю в своей переменной «selectedDoctor». Кажется, что все врачи из списка выбраны в одно и то же время. Это абсолютно сумасшедший, я считаю, что я отброшу этот глупый selectOneListbox –

+0

@ Sorin-AlexandruCristescu К сожалению, я поставил вас в неправильном направлении, вам действительно нужен конвертер как модифицировано ответ. –

+0

Правильно, я ожидал, что смогу сделать это без конвертера. Но это тоже нормально, я попробую, он должен работать ... Большое спасибо. Любая идея, почему String не работает (как я объяснил)? Для этого мне не нужен конвертер. –